<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kurumsal Java Yazılımı &#187; Püf Noktası</title>
	<atom:link href="http://www.kurumsaljava.com/category/puf-noktasi/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kurumsaljava.com</link>
	<description>Java Enterprise Architecture by Ozcan Acar</description>
	<lastBuildDate>Fri, 30 Dec 2011 09:28:45 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>IDL Compiler</title>
		<link>http://www.kurumsaljava.com/2011/05/09/idl-compiler/</link>
		<comments>http://www.kurumsaljava.com/2011/05/09/idl-compiler/#comments</comments>
		<pubDate>Mon, 09 May 2011 09:47:34 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Püf Noktası]]></category>
		<category><![CDATA[Corba]]></category>
		<category><![CDATA[IDL]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1395</guid>
		<description><![CDATA[<p>Bu aralar bir Corba projesinde çalışıyorum. Corba teknolojisinde interface tanımlama dili olarak IDL kullanılıyor. Eğer bir Corba servisine erişimi sağlamak için size bir IDL verildi ise, bu IDL´i kullanarak client sınıflarını oluşturabilirsiniz. Bu işlem için aşağidaki sınıfı oluşturdum.</p>
<p><span id="more-1395"></span></p>
<p>Bu implementasyon Sun JDK bünyesinde bulunan <b>com.sun.tools.corba.se.idl.toJavaPortable.Compile</b> ve IBM JDK bünyesinde bulunan <b>com.ibm.idl.toJavaPortable.Compile</b> sınıflarını kullanarak client sınıflarını oluşturuyor. Bu iki sınıf JDK lib dizini altındaki <b>tools.jar</b> içinde yer alıyor. Sınıfın bulunabilmesi için -Djava.home=<JDK HOME> parametresinin tanımlanmasi gerekiyor. JDK bin dizininde yer alan <b>idlj</b> komutu ile aynı işlemi gerçekleştirebilirsiniz.</p>
<pre name="code" class="java">

/**
 *
 * @author F520947 Oezcan Acar
 *
 */
public interface IdlToJavaGeneratorService
{
	void generate( String workingDir, String idlFile, String outputDirectroy );
}
</pre>
<pre name="code" class="java">

import java.io.File;
import java.io.PrintStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;

import org.codehaus.plexus.util.StringOutputStream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.csg.cs.testing.common.CommonConstants;
import com.csg.cs.testing.generator.GeneratorException;
import com.csg.cs.testing.project.ProjectDirectoryUtils;
import com.csg.cs.testing.service.logger.ILogger;

/**
 *
 * @author F520947 Oezcan Acar
 *
 */
@Component
final class DefaultIdlToJavaGeneratorServiceImpl implements IdlToJavaGeneratorService
{

	@Autowired
	private ILogger logger;

	@Autowired
	private IIdlParserService parser;

	@Override
	public void generate( final String inputDirectory, final String idlFile, final String outputDirectory)
	{

		File idl = new File( ProjectDirectoryUtils.getWorkingDirRoot() + &quot;/&quot; + idlFile );
		List&lt; String &gt; includes = parser.getIdlIncludes( idl );

		List&lt;String&gt; args = new ArrayList&lt; String &gt;();

		args.add( &quot;-emitAll&quot; );
        args.add( &quot;-fclient&quot; );
        args.add( &quot;-pkgPrefix&quot; );

        String interfaceName = parser.getRealInterface( idl );
        args.add( interfaceName );
        args.add( CommonConstants.SERVICE_PACKAGE );

        for (String include : includes)
		{
        	args.add( &quot;-pkgPrefix&quot; );
            args.add( include );
            args.add( CommonConstants.SERVICE_PACKAGE );
		}

        List&lt; String &gt; baseInterfaces = parser.getBaseInterfaces( idl );
        for (String base : baseInterfaces)
		{
        	args.add( &quot;-pkgPrefix&quot; );
            args.add( base );
            args.add( CommonConstants.SERVICE_PACKAGE );
		}

        args.add( &quot;-pkgPrefix&quot; );
        args.add( &quot;CS_Inquiry_0_0&quot; );
        args.add( CommonConstants.SERVICE_PACKAGE );

        args.add( &quot;-pkgPrefix&quot; );
        args.add( &quot;CS_Inquiry_0_0Operations&quot; );
        args.add( CommonConstants.SERVICE_PACKAGE );

        args.add( &quot;-i&quot; );
        args.add( inputDirectory );
        args.add( &quot;-td&quot; );
        args.add( outputDirectory );
        args.add( idlFile );

        Class&lt;?&gt; compilerClass = getCompilerClass();
        invokeCompiler( compilerClass, args );
	}

	private Class&lt;?&gt; getCompilerClass()
	{
		ClassLoader cl = this.getClass().getClassLoader();
		Class&lt;?&gt; idljCompiler;
		try
		{
			idljCompiler = Class.forName(getIDLCompilerClass());
		}
		catch (ClassNotFoundException e)
		{
			try
			{
				File javaHome = new File(System.getProperty(&quot;java.home&quot;));
				logger.log(&quot;java.home=&quot; + javaHome);
				logger.log(&quot;tools.har=&quot; + javaHome+&quot;/lib/tools.jar&quot;);

				File toolsJar = new File(javaHome, &quot;/lib/tools.jar&quot;);
				URL toolsJarUrl = toolsJar.toURL();
				URLClassLoader urlLoader = new URLClassLoader(new URL[]
				{ toolsJarUrl }, cl);

				// Unfortunately the idlj compiler reads messages using the
				// system class path.
				// Therefore this really nasty hack is required.
				System.setProperty(&quot;java.class.path&quot;,System.getProperty(&quot;java.class.path&quot;)+ System.getProperty(&quot;path.separator&quot;)+ toolsJar.getAbsolutePath());
				if (System.getProperty(&quot;java.vm.name&quot;).indexOf(&quot;HotSpot&quot;) != -1)
				{
					urlLoader.loadClass(&quot;com.sun.tools.corba.se.idl.som.cff.FileLocator&quot;);
				}
				idljCompiler = urlLoader.loadClass(getIDLCompilerClass());
			}
			catch (Exception notUsed)
			{
				throw new GeneratorException(notUsed);
			}
		}
		return idljCompiler;
	}

	private String getIDLCompilerClass()
    {
        String vendor = System.getProperty( &quot;java.vm.vendor&quot; );

        if ( vendor.indexOf( &quot;IBM&quot; ) != -1 )
        {
            return &quot;com.ibm.idl.toJavaPortable.Compile&quot;;
        }
        return &quot;com.sun.tools.corba.se.idl.toJavaPortable.Compile&quot;;
    }

	private void invokeCompiler( final Class&lt;?&gt; compilerClass, final List&lt;String&gt; args)
	{
		logger.log(&quot;Current dir : &quot; + System.getProperty(&quot;user.dir&quot;));
		Method compilerMainMethod;
		String arguments[];

		args.add(0, &quot;-verbose&quot;);
		arguments = (String[]) args.toArray(new String[args.size()]);
		String command = compilerClass.getName();
		for (int i = 0; i &lt; arguments.length; i++)
		{
			command += &quot; &quot; + arguments[i];
		}
		logger.log(command);

		try
		{
			compilerMainMethod = compilerClass.getMethod(&quot;main&quot;, new Class[] { String[].class });
		}
		catch (NoSuchMethodException e1)
		{
			throw new GeneratorException(&quot;Error: Compiler had no main method&quot;);
		}

		int exitCode = 0;
		// Backup std channels
		PrintStream stdErr = System.err;
		PrintStream stdOut = System.out;
		// Local channels
		StringOutputStream err = new StringOutputStream();
		StringOutputStream out = new StringOutputStream();
		System.setErr(new PrintStream(err));
		System.setOut(new PrintStream(out));
		try
		{
			Object retVal = (Object) compilerMainMethod.invoke(compilerClass,new Object[]{ arguments });
			if (retVal != null &amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp; retVal instanceof Integer)
				exitCode = ((Integer) retVal).intValue();

		}
		catch (InvocationTargetException e)
		{
			throw new GeneratorException(e);
		}
		catch (Throwable e)
		{
			e.printStackTrace();
			throw new GeneratorException(&quot;IDL compilation failed&quot;);
		}
		finally
		{
			if (!&quot;&quot;.equals(out.toString()))		logger.log(out.toString());
			if (!&quot;&quot;.equals(err.toString()))		logger.log(err.toString());
			// Restore std channels
			System.setErr(stdErr);
			System.setOut(stdOut);
		}
	}

}
</pre>
<p><i><br />
EOF ( End Of Fun )<br />
Özcan Acar<br />
</i></p>
]]></description>
			<content:encoded><![CDATA[<p>Bu aralar bir Corba projesinde çalışıyorum. Corba teknolojisinde interface tanımlama dili olarak IDL kullanılıyor. Eğer bir Corba servisine erişimi sağlamak için size bir IDL verildi ise, bu IDL´i kullanarak client sınıflarını oluşturabilirsiniz. Bu işlem için aşağidaki sınıfı oluşturdum.</p>
<p><span id="more-1395"></span></p>
<p>Bu implementasyon Sun JDK bünyesinde bulunan <b>com.sun.tools.corba.se.idl.toJavaPortable.Compile</b> ve IBM JDK bünyesinde bulunan <b>com.ibm.idl.toJavaPortable.Compile</b> sınıflarını kullanarak client sınıflarını oluşturuyor. Bu iki sınıf JDK lib dizini altındaki <b>tools.jar</b> içinde yer alıyor. Sınıfın bulunabilmesi için -Djava.home=<JDK HOME> parametresinin tanımlanmasi gerekiyor. JDK bin dizininde yer alan <b>idlj</b> komutu ile aynı işlemi gerçekleştirebilirsiniz.</p>
<pre name="code" class="java">

/**
 *
 * @author F520947 Oezcan Acar
 *
 */
public interface IdlToJavaGeneratorService
{
	void generate( String workingDir, String idlFile, String outputDirectroy );
}
</pre>
<pre name="code" class="java">

import java.io.File;
import java.io.PrintStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;

import org.codehaus.plexus.util.StringOutputStream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.csg.cs.testing.common.CommonConstants;
import com.csg.cs.testing.generator.GeneratorException;
import com.csg.cs.testing.project.ProjectDirectoryUtils;
import com.csg.cs.testing.service.logger.ILogger;

/**
 *
 * @author F520947 Oezcan Acar
 *
 */
@Component
final class DefaultIdlToJavaGeneratorServiceImpl implements IdlToJavaGeneratorService
{

	@Autowired
	private ILogger logger;

	@Autowired
	private IIdlParserService parser;

	@Override
	public void generate( final String inputDirectory, final String idlFile, final String outputDirectory)
	{

		File idl = new File( ProjectDirectoryUtils.getWorkingDirRoot() + &quot;/&quot; + idlFile );
		List&lt; String &gt; includes = parser.getIdlIncludes( idl );

		List&lt;String&gt; args = new ArrayList&lt; String &gt;();

		args.add( &quot;-emitAll&quot; );
        args.add( &quot;-fclient&quot; );
        args.add( &quot;-pkgPrefix&quot; );

        String interfaceName = parser.getRealInterface( idl );
        args.add( interfaceName );
        args.add( CommonConstants.SERVICE_PACKAGE );

        for (String include : includes)
		{
        	args.add( &quot;-pkgPrefix&quot; );
            args.add( include );
            args.add( CommonConstants.SERVICE_PACKAGE );
		}

        List&lt; String &gt; baseInterfaces = parser.getBaseInterfaces( idl );
        for (String base : baseInterfaces)
		{
        	args.add( &quot;-pkgPrefix&quot; );
            args.add( base );
            args.add( CommonConstants.SERVICE_PACKAGE );
		}

        args.add( &quot;-pkgPrefix&quot; );
        args.add( &quot;CS_Inquiry_0_0&quot; );
        args.add( CommonConstants.SERVICE_PACKAGE );

        args.add( &quot;-pkgPrefix&quot; );
        args.add( &quot;CS_Inquiry_0_0Operations&quot; );
        args.add( CommonConstants.SERVICE_PACKAGE );

        args.add( &quot;-i&quot; );
        args.add( inputDirectory );
        args.add( &quot;-td&quot; );
        args.add( outputDirectory );
        args.add( idlFile );

        Class&lt;?&gt; compilerClass = getCompilerClass();
        invokeCompiler( compilerClass, args );
	}

	private Class&lt;?&gt; getCompilerClass()
	{
		ClassLoader cl = this.getClass().getClassLoader();
		Class&lt;?&gt; idljCompiler;
		try
		{
			idljCompiler = Class.forName(getIDLCompilerClass());
		}
		catch (ClassNotFoundException e)
		{
			try
			{
				File javaHome = new File(System.getProperty(&quot;java.home&quot;));
				logger.log(&quot;java.home=&quot; + javaHome);
				logger.log(&quot;tools.har=&quot; + javaHome+&quot;/lib/tools.jar&quot;);

				File toolsJar = new File(javaHome, &quot;/lib/tools.jar&quot;);
				URL toolsJarUrl = toolsJar.toURL();
				URLClassLoader urlLoader = new URLClassLoader(new URL[]
				{ toolsJarUrl }, cl);

				// Unfortunately the idlj compiler reads messages using the
				// system class path.
				// Therefore this really nasty hack is required.
				System.setProperty(&quot;java.class.path&quot;,System.getProperty(&quot;java.class.path&quot;)+ System.getProperty(&quot;path.separator&quot;)+ toolsJar.getAbsolutePath());
				if (System.getProperty(&quot;java.vm.name&quot;).indexOf(&quot;HotSpot&quot;) != -1)
				{
					urlLoader.loadClass(&quot;com.sun.tools.corba.se.idl.som.cff.FileLocator&quot;);
				}
				idljCompiler = urlLoader.loadClass(getIDLCompilerClass());
			}
			catch (Exception notUsed)
			{
				throw new GeneratorException(notUsed);
			}
		}
		return idljCompiler;
	}

	private String getIDLCompilerClass()
    {
        String vendor = System.getProperty( &quot;java.vm.vendor&quot; );

        if ( vendor.indexOf( &quot;IBM&quot; ) != -1 )
        {
            return &quot;com.ibm.idl.toJavaPortable.Compile&quot;;
        }
        return &quot;com.sun.tools.corba.se.idl.toJavaPortable.Compile&quot;;
    }

	private void invokeCompiler( final Class&lt;?&gt; compilerClass, final List&lt;String&gt; args)
	{
		logger.log(&quot;Current dir : &quot; + System.getProperty(&quot;user.dir&quot;));
		Method compilerMainMethod;
		String arguments[];

		args.add(0, &quot;-verbose&quot;);
		arguments = (String[]) args.toArray(new String[args.size()]);
		String command = compilerClass.getName();
		for (int i = 0; i &lt; arguments.length; i++)
		{
			command += &quot; &quot; + arguments[i];
		}
		logger.log(command);

		try
		{
			compilerMainMethod = compilerClass.getMethod(&quot;main&quot;, new Class[] { String[].class });
		}
		catch (NoSuchMethodException e1)
		{
			throw new GeneratorException(&quot;Error: Compiler had no main method&quot;);
		}

		int exitCode = 0;
		// Backup std channels
		PrintStream stdErr = System.err;
		PrintStream stdOut = System.out;
		// Local channels
		StringOutputStream err = new StringOutputStream();
		StringOutputStream out = new StringOutputStream();
		System.setErr(new PrintStream(err));
		System.setOut(new PrintStream(out));
		try
		{
			Object retVal = (Object) compilerMainMethod.invoke(compilerClass,new Object[]{ arguments });
			if (retVal != null &amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp; retVal instanceof Integer)
				exitCode = ((Integer) retVal).intValue();

		}
		catch (InvocationTargetException e)
		{
			throw new GeneratorException(e);
		}
		catch (Throwable e)
		{
			e.printStackTrace();
			throw new GeneratorException(&quot;IDL compilation failed&quot;);
		}
		finally
		{
			if (!&quot;&quot;.equals(out.toString()))		logger.log(out.toString());
			if (!&quot;&quot;.equals(err.toString()))		logger.log(err.toString());
			// Restore std channels
			System.setErr(stdErr);
			System.setOut(stdOut);
		}
	}

}
</pre>
<p><i><br />
EOF ( End Of Fun )<br />
Özcan Acar<br />
</i></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2011%2F05%2F09%2Fidl-compiler%2F&amp;linkname=IDL%20Compiler"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2011/05/09/idl-compiler/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Subclipse Şifresi</title>
		<link>http://www.kurumsaljava.com/2011/04/28/subclipse-sifresi/</link>
		<comments>http://www.kurumsaljava.com/2011/04/28/subclipse-sifresi/#comments</comments>
		<pubDate>Thu, 28 Apr 2011 10:20:42 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Püf Noktası]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Subclipse]]></category>
		<category><![CDATA[Subversion]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1382</guid>
		<description><![CDATA[<p>Elipse altında Subversion pluginini kullanıyorsanız, bir Subversion repositorisine bağlanmak için kullandığınız şifreyi nasıl değiştirebileceğinizi merak etmiş olabilirsiniz. Eclipse altında bu şifreyi değiştirmek mümkün değil, çünkü plugin şifreyi <b>%APPDATA%\Subversion\auth</b> (Linux altında ~/.subversion/auth) altında saklıyor. Bu dizini sildiğiniz taktirde, tekrar şifreyi girme panelini görebilirsiniz.</p>
<p><span id="more-1382"></span></p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2011/04/svn.jpg"><img src="http://www.kurumsaljava.com/wp-content/uploads/2011/04/svn.jpg" alt="" title="svn" width="575" height="299" class="aligncenter size-full wp-image-1383" /></a></p>
]]></description>
			<content:encoded><![CDATA[<p>Elipse altında Subversion pluginini kullanıyorsanız, bir Subversion repositorisine bağlanmak için kullandığınız şifreyi nasıl değiştirebileceğinizi merak etmiş olabilirsiniz. Eclipse altında bu şifreyi değiştirmek mümkün değil, çünkü plugin şifreyi <b>%APPDATA%\Subversion\auth</b> (Linux altında ~/.subversion/auth) altında saklıyor. Bu dizini sildiğiniz taktirde, tekrar şifreyi girme panelini görebilirsiniz.</p>
<p><span id="more-1382"></span></p>
<p><a href="http://www.kurumsaljava.com/wp-content/uploads/2011/04/svn.jpg"><img src="http://www.kurumsaljava.com/wp-content/uploads/2011/04/svn.jpg" alt="" title="svn" width="575" height="299" class="aligncenter size-full wp-image-1383" /></a></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2011%2F04%2F28%2Fsubclipse-sifresi%2F&amp;linkname=Subclipse%20%C5%9Eifresi"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2011/04/28/subclipse-sifresi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Maven2 ve OutOfMemory</title>
		<link>http://www.kurumsaljava.com/2010/10/26/maven2-ve-outofmemory/</link>
		<comments>http://www.kurumsaljava.com/2010/10/26/maven2-ve-outofmemory/#comments</comments>
		<pubDate>Tue, 26 Oct 2010 08:13:43 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Proje Günlüğü]]></category>
		<category><![CDATA[Püf Noktası]]></category>
		<category><![CDATA[Maven2]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1260</guid>
		<description><![CDATA[<p>Danışman olarak çalıştığım bir projenin modüllerini Maven2 kullanacak şekilde yeniden yapılandırdım. Birçok JAR ve WAR dosyası bir araya gelerek büyük bir EAR dosyası oluşturdu. JAR ve WAR&#8217;ları oluştururken bir sorun yaşamadım, lakin EAR dosyasını alırken durum farkli idi. EAR projesi için <i><b>maven clean install</b></i> komutunu kullandığımda aşağıdaki hata oluşuyordu:</p>
<p><span id="more-1260"></span></p>
<pre name="code" class="java">

java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:2882)
        at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
        at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:515)
        at java.lang.StringBuffer.append(StringBuffer.java:306)
        at java.io.StringWriter.write(StringWriter.java:77)
        at hidden.org.codehaus.plexus.util.IOUtil.copy(IOUtil.java:214)
        at hidden.org.codehaus.plexus.util.IOUtil.toString(IOUtil.java:416)
        at hidden.org.codehaus.plexus.util.IOUtil.toString(IOUtil.java:405)
        at org.apache.maven.project.DefaultMavenProjectBuilder.readModel(DefaultMavenProjectBuilder.java:1595)
        at org.apache.maven.project.DefaultMavenProjectBuilder.readModel(DefaultMavenProjectBuilder.java:1571)
        at org.apache.maven.project.DefaultMavenProjectBuilder.findModelFromRepository(DefaultMavenProjectBuilder.java:562)
        at org.apache.maven.project.DefaultMavenProjectBuilder.buildFromRepository(DefaultMavenProjectBuilder.java:251)
        at org.apache.maven.project.artifact.MavenMetadataSource.retrieveRelocatedProject(MavenMetadataSource.java:163)
        at org.apache.maven.project.artifact.MavenMetadataSource.retrieveRelocatedArtifact(MavenMetadataSource.java:94)
        at org.apache.maven.artifact.resolver.DefaultArtifactCollector.recurse(DefaultArtifactCollector.java:387)
        at org.apache.maven.artifact.resolver.DefaultArtifactCollector.recurse(DefaultArtifactCollector.java:435)
        at org.apache.maven.artifact.resolver.DefaultArtifactCollector.recurse(DefaultArtifactCollector.java:435)
        at org.apache.maven.artifact.resolver.DefaultArtifactCollector.collect(DefaultArtifactCollector.java:74)
        at org.apache.maven.artifact.resolver.DefaultArtifactResolver.resolveTransitively(DefaultArtifactResolver.java:316)
        at org.apache.maven.artifact.resolver.DefaultArtifactResolver.resolveTransitively(DefaultArtifactResolver.java:304)
        at org.apache.maven.plugin.DefaultPluginManager.resolveTransitiveDependencies(DefaultPluginManager.java:1499)
        at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:442)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:556)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:535)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)
        at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60)
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Tue Oct 26 11:40:45 EEST 2010
[INFO] Final Memory: 9M/9M
[INFO] ------------------------------------------------------------------------
C:\CCVIEWS\itcs_oacar_UCM_YUKSELIS\CBVOB01\CorebankingAppBuilder&gt;
</pre>
<p>EAR dosyası birçok JAR ve WAR&#8217;dan oluştuğu için doğal olarak büyük bir hacme sahip. Default Maven2 ayarları bu boyuttaki bir EAR dosyasını oluşturmak için yeterli değil.</p>
<p>Bu sorunu aşmak için Maven&#8217;in daha fazla hafıza alanını kullanabilmesi gerekiyor. Bunu sağlamak için Windows işletim sistem ile çalışıyorsanız, console altında </p>
<p><b>set MAVEN_OPTS=-Xmx512m </b></p>
<p>ya da Linux/Unix altında</p>
<p><b>export MAVEN_OPTS=-Xmx512m</b></p>
<p>komutunu girmeniz yeterli. Bir sonraki mvn komutu tanımladığınız şekilde yeni hafıza alanı ile çalşacaktır.</p>
]]></description>
			<content:encoded><![CDATA[<p>Danışman olarak çalıştığım bir projenin modüllerini Maven2 kullanacak şekilde yeniden yapılandırdım. Birçok JAR ve WAR dosyası bir araya gelerek büyük bir EAR dosyası oluşturdu. JAR ve WAR&#8217;ları oluştururken bir sorun yaşamadım, lakin EAR dosyasını alırken durum farkli idi. EAR projesi için <i><b>maven clean install</b></i> komutunu kullandığımda aşağıdaki hata oluşuyordu:</p>
<p><span id="more-1260"></span></p>
<pre name="code" class="java">

java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:2882)
        at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
        at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:515)
        at java.lang.StringBuffer.append(StringBuffer.java:306)
        at java.io.StringWriter.write(StringWriter.java:77)
        at hidden.org.codehaus.plexus.util.IOUtil.copy(IOUtil.java:214)
        at hidden.org.codehaus.plexus.util.IOUtil.toString(IOUtil.java:416)
        at hidden.org.codehaus.plexus.util.IOUtil.toString(IOUtil.java:405)
        at org.apache.maven.project.DefaultMavenProjectBuilder.readModel(DefaultMavenProjectBuilder.java:1595)
        at org.apache.maven.project.DefaultMavenProjectBuilder.readModel(DefaultMavenProjectBuilder.java:1571)
        at org.apache.maven.project.DefaultMavenProjectBuilder.findModelFromRepository(DefaultMavenProjectBuilder.java:562)
        at org.apache.maven.project.DefaultMavenProjectBuilder.buildFromRepository(DefaultMavenProjectBuilder.java:251)
        at org.apache.maven.project.artifact.MavenMetadataSource.retrieveRelocatedProject(MavenMetadataSource.java:163)
        at org.apache.maven.project.artifact.MavenMetadataSource.retrieveRelocatedArtifact(MavenMetadataSource.java:94)
        at org.apache.maven.artifact.resolver.DefaultArtifactCollector.recurse(DefaultArtifactCollector.java:387)
        at org.apache.maven.artifact.resolver.DefaultArtifactCollector.recurse(DefaultArtifactCollector.java:435)
        at org.apache.maven.artifact.resolver.DefaultArtifactCollector.recurse(DefaultArtifactCollector.java:435)
        at org.apache.maven.artifact.resolver.DefaultArtifactCollector.collect(DefaultArtifactCollector.java:74)
        at org.apache.maven.artifact.resolver.DefaultArtifactResolver.resolveTransitively(DefaultArtifactResolver.java:316)
        at org.apache.maven.artifact.resolver.DefaultArtifactResolver.resolveTransitively(DefaultArtifactResolver.java:304)
        at org.apache.maven.plugin.DefaultPluginManager.resolveTransitiveDependencies(DefaultPluginManager.java:1499)
        at org.apache.maven.plugin.DefaultPluginManager.executeMojo(DefaultPluginManager.java:442)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoals(DefaultLifecycleExecutor.java:694)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalWithLifecycle(DefaultLifecycleExecutor.java:556)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoal(DefaultLifecycleExecutor.java:535)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeGoalAndHandleFailures(DefaultLifecycleExecutor.java:387)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.executeTaskSegments(DefaultLifecycleExecutor.java:348)
        at org.apache.maven.lifecycle.DefaultLifecycleExecutor.execute(DefaultLifecycleExecutor.java:180)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:328)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:138)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:362)
        at org.apache.maven.cli.compat.CompatibleMain.main(CompatibleMain.java:60)
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Tue Oct 26 11:40:45 EEST 2010
[INFO] Final Memory: 9M/9M
[INFO] ------------------------------------------------------------------------
C:\CCVIEWS\itcs_oacar_UCM_YUKSELIS\CBVOB01\CorebankingAppBuilder&gt;
</pre>
<p>EAR dosyası birçok JAR ve WAR&#8217;dan oluştuğu için doğal olarak büyük bir hacme sahip. Default Maven2 ayarları bu boyuttaki bir EAR dosyasını oluşturmak için yeterli değil.</p>
<p>Bu sorunu aşmak için Maven&#8217;in daha fazla hafıza alanını kullanabilmesi gerekiyor. Bunu sağlamak için Windows işletim sistem ile çalışıyorsanız, console altında </p>
<p><b>set MAVEN_OPTS=-Xmx512m </b></p>
<p>ya da Linux/Unix altında</p>
<p><b>export MAVEN_OPTS=-Xmx512m</b></p>
<p>komutunu girmeniz yeterli. Bir sonraki mvn komutu tanımladığınız şekilde yeni hafıza alanı ile çalşacaktır.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2010%2F10%2F26%2Fmaven2-ve-outofmemory%2F&amp;linkname=Maven2%20ve%20OutOfMemory"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2010/10/26/maven2-ve-outofmemory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kim Daha İyi Programcı?</title>
		<link>http://www.kurumsaljava.com/2010/10/23/kim-daha-iyi-programci/</link>
		<comments>http://www.kurumsaljava.com/2010/10/23/kim-daha-iyi-programci/#comments</comments>
		<pubDate>Sat, 23 Oct 2010 16:25:49 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Püf Noktası]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1242</guid>
		<description><![CDATA[<p>Çoğu zaman programcı adaylarının piyasada en çok talep gören programramlama dilini seçip, bu dili öğrendikleri malum. Bu doğal bir seçim; talep olan yerde arzın bedeli olur. Bu bedel programcının iyi bir maaş ile hayatını sürdürmesi anlamına gelir.</p>
<p><span id="more-1242"></span></p>
<p>Bilindiği üzere son zamanların en popüler ve talep edilen dili Java. İnternetteki birçok istatiktik Java&#8217;nın bir numara olduğunu tastikliyor. Programcı adaylarının da Java&#8217;yı seçmeleri doğal.</p>
<p>Java&#8217;yi bilenler ve kullananlar iyi ve akıllı programcılardır degil mi? Peki Python ya da piyasası pek fazla olmayan bir başka dili bilen bir programcının sadece Java&#8217;ya hakim bir programcıdan daha iyi ve akıllı bir programcı olduğunu söylesem nasıl tepki verirdiniz?</p>
<p>İyi programcı, program yazmayı seven programcıdır. İyi programcı yenilikleri deneyip, ufkunu genişleten programcıdır. İyi programcı programcılık dünyasının sadece Java’dan oluşmadığını bilendir. Peki iyi programcıyı nasıl anlarsınız? Bir sonraki iş görüşmesinde işe alınacak programcı adayına Java haricinde hangi dil ya da dilleri bildiğini sorun. Alacağınız cevap programcının ne kadar iyi olduğunu gösteren indikatördür. Eğer aday sadece Java’yı bildiğini söylerse iyi bir programcı olma ihtimali doğru olabilir. Bunun ispatı edindiği tecrübeler ve bilgi birikimidir. Eğer aday Java’nın yanında Python ya da Groovy dillerine de hakim olduğunu söylerse, bilin ki karşınızda akıllı (smart) bir aday duruyor. Neden?  Bunun nedeni çok basit. Piyasası olmayan bir programlama dilini ögrenmiş bir programcı, program yazmayı gerçekten seviyor olmalı ki talebin dışında kalan bir programlama dilini zaman ayırarak öğrenmiş. Bu onun yenilikçi, ögrenmeyi  ve program yazmayı seven birisi oldugunu gösterir. Karşınızdaki bu kişi büyük bir ihtimalle sadece Java bilen bir adaydan çok daha akıllı ve programcılık konusunda ileri seviyede.</p>
<p>Yanlış anlaşılmasın; Java’ya hakim olanlarda mutlaka iyi programcılardır. İyileri de var, iyi olmayanları da. Ama piyasının ihtiyacı olmayan bir dili öğrenen bir programcı çok daha fazla potansiyele sahip. Bu bir gercek! Ben böyle bir programcıyı tercih ederdim.</p>
<p>Sadece bir programlama dilinde (bu genelde piyasası olan bir dil olacaktır) takılıp kalmış olanların verdiği cevap hep aynı olacaktır: “Çalıştığım ortamlarda yeni bir programlama dili öğrenme fırsatı bulamadım.”  Gerçekten programcılığa gönül vermiş birisi o fırsatı hemen yaratır!</p>
<p>Bu konuda <a href="http://www.paulgraham.com/gh.html" target=_blank>Paul Graham’ın yazısını</a> okumanızı tavsiye ederim.</p>
]]></description>
			<content:encoded><![CDATA[<p>Çoğu zaman programcı adaylarının piyasada en çok talep gören programramlama dilini seçip, bu dili öğrendikleri malum. Bu doğal bir seçim; talep olan yerde arzın bedeli olur. Bu bedel programcının iyi bir maaş ile hayatını sürdürmesi anlamına gelir.</p>
<p><span id="more-1242"></span></p>
<p>Bilindiği üzere son zamanların en popüler ve talep edilen dili Java. İnternetteki birçok istatiktik Java&#8217;nın bir numara olduğunu tastikliyor. Programcı adaylarının da Java&#8217;yı seçmeleri doğal.</p>
<p>Java&#8217;yi bilenler ve kullananlar iyi ve akıllı programcılardır degil mi? Peki Python ya da piyasası pek fazla olmayan bir başka dili bilen bir programcının sadece Java&#8217;ya hakim bir programcıdan daha iyi ve akıllı bir programcı olduğunu söylesem nasıl tepki verirdiniz?</p>
<p>İyi programcı, program yazmayı seven programcıdır. İyi programcı yenilikleri deneyip, ufkunu genişleten programcıdır. İyi programcı programcılık dünyasının sadece Java’dan oluşmadığını bilendir. Peki iyi programcıyı nasıl anlarsınız? Bir sonraki iş görüşmesinde işe alınacak programcı adayına Java haricinde hangi dil ya da dilleri bildiğini sorun. Alacağınız cevap programcının ne kadar iyi olduğunu gösteren indikatördür. Eğer aday sadece Java’yı bildiğini söylerse iyi bir programcı olma ihtimali doğru olabilir. Bunun ispatı edindiği tecrübeler ve bilgi birikimidir. Eğer aday Java’nın yanında Python ya da Groovy dillerine de hakim olduğunu söylerse, bilin ki karşınızda akıllı (smart) bir aday duruyor. Neden?  Bunun nedeni çok basit. Piyasası olmayan bir programlama dilini ögrenmiş bir programcı, program yazmayı gerçekten seviyor olmalı ki talebin dışında kalan bir programlama dilini zaman ayırarak öğrenmiş. Bu onun yenilikçi, ögrenmeyi  ve program yazmayı seven birisi oldugunu gösterir. Karşınızdaki bu kişi büyük bir ihtimalle sadece Java bilen bir adaydan çok daha akıllı ve programcılık konusunda ileri seviyede.</p>
<p>Yanlış anlaşılmasın; Java’ya hakim olanlarda mutlaka iyi programcılardır. İyileri de var, iyi olmayanları da. Ama piyasının ihtiyacı olmayan bir dili öğrenen bir programcı çok daha fazla potansiyele sahip. Bu bir gercek! Ben böyle bir programcıyı tercih ederdim.</p>
<p>Sadece bir programlama dilinde (bu genelde piyasası olan bir dil olacaktır) takılıp kalmış olanların verdiği cevap hep aynı olacaktır: “Çalıştığım ortamlarda yeni bir programlama dili öğrenme fırsatı bulamadım.”  Gerçekten programcılığa gönül vermiş birisi o fırsatı hemen yaratır!</p>
<p>Bu konuda <a href="http://www.paulgraham.com/gh.html" target=_blank>Paul Graham’ın yazısını</a> okumanızı tavsiye ederim.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2010%2F10%2F23%2Fkim-daha-iyi-programci%2F&amp;linkname=Kim%20Daha%20%C4%B0yi%20Programc%C4%B1%3F"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2010/10/23/kim-daha-iyi-programci/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Java Compiler Versiyonu</title>
		<link>http://www.kurumsaljava.com/2010/05/26/java-compiler-versiyonu/</link>
		<comments>http://www.kurumsaljava.com/2010/05/26/java-compiler-versiyonu/#comments</comments>
		<pubDate>Wed, 26 May 2010 14:42:54 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Püf Noktası]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1156</guid>
		<description><![CDATA[<p>Bir Java sınıfının hangi Java compiler versiyonu ile derlendiğini görmek için <b>javap</b> komutu aşağıdaki şekilde kullanılır. <span id="more-1156"></span></p>
<pre name="code" class="java">

C:\&gt;javap.exe -verbose tumbler.Story
Compiled from &quot;Story.java&quot;
public interface tumbler.Story extends java.lang.annotation.Annotation
  SourceFile: &quot;Story.java&quot;
  RuntimeVisibleAnnotations: length = 0x1B
   00 02 00 09 00 01 00 04 65 00 0A 00 0B 00 0C 00
   01 00 04 5B 00 01 65 00 0D 00 0E
  minor version: 0
  major version: 50
  Constant pool:
const #1 = class        #15;    //  tumbler/Story
const #2 = class        #16;    //  java/lang/Object
const #3 = class        #17;    //  java/lang/annotation/Annotation
const #4 = Asciz        value;
const #5 = Asciz        ()Ljava/lang/String;;
const #6 = Asciz        SourceFile;
const #7 = Asciz        Story.java;
const #8 = Asciz        RuntimeVisibleAnnotations;
const #9 = Asciz        Ljava/lang/annotation/Retention;;
const #10 = Asciz       Ljava/lang/annotation/RetentionPolicy;;
const #11 = Asciz       RUNTIME;
const #12 = Asciz       Ljava/lang/annotation/Target;;
const #13 = Asciz       Ljava/lang/annotation/ElementType;;
const #14 = Asciz       TYPE;
const #15 = Asciz       tumbler/Story;
const #16 = Asciz       java/lang/Object;
const #17 = Asciz       java/lang/annotation/Annotation;

{
public abstract java.lang.String value();

}
</pre>
<p><b>thumbler.Story</b> sınıfı için major number 50, minor number 0 görünmektektedir. Aşağıdaki listeden bu sınıfın hangi Java compiler versiyonu ile derlendiğini anlamak mümkündür.</p>
<p>* Java 1.2 uses major version 46<br />
* Java 1.3 uses major version 47<br />
* Java 1.4 uses major version 48<br />
* Java 5 uses major version 49<br />
* Java 6 uses major version 50</p>
<p><i><br />
EOF ( End Of Fun)<br />
Özcan Acar<br />
</i></p>
]]></description>
			<content:encoded><![CDATA[<p>Bir Java sınıfının hangi Java compiler versiyonu ile derlendiğini görmek için <b>javap</b> komutu aşağıdaki şekilde kullanılır. <span id="more-1156"></span></p>
<pre name="code" class="java">

C:\&gt;javap.exe -verbose tumbler.Story
Compiled from &quot;Story.java&quot;
public interface tumbler.Story extends java.lang.annotation.Annotation
  SourceFile: &quot;Story.java&quot;
  RuntimeVisibleAnnotations: length = 0x1B
   00 02 00 09 00 01 00 04 65 00 0A 00 0B 00 0C 00
   01 00 04 5B 00 01 65 00 0D 00 0E
  minor version: 0
  major version: 50
  Constant pool:
const #1 = class        #15;    //  tumbler/Story
const #2 = class        #16;    //  java/lang/Object
const #3 = class        #17;    //  java/lang/annotation/Annotation
const #4 = Asciz        value;
const #5 = Asciz        ()Ljava/lang/String;;
const #6 = Asciz        SourceFile;
const #7 = Asciz        Story.java;
const #8 = Asciz        RuntimeVisibleAnnotations;
const #9 = Asciz        Ljava/lang/annotation/Retention;;
const #10 = Asciz       Ljava/lang/annotation/RetentionPolicy;;
const #11 = Asciz       RUNTIME;
const #12 = Asciz       Ljava/lang/annotation/Target;;
const #13 = Asciz       Ljava/lang/annotation/ElementType;;
const #14 = Asciz       TYPE;
const #15 = Asciz       tumbler/Story;
const #16 = Asciz       java/lang/Object;
const #17 = Asciz       java/lang/annotation/Annotation;

{
public abstract java.lang.String value();

}
</pre>
<p><b>thumbler.Story</b> sınıfı için major number 50, minor number 0 görünmektektedir. Aşağıdaki listeden bu sınıfın hangi Java compiler versiyonu ile derlendiğini anlamak mümkündür.</p>
<p>* Java 1.2 uses major version 46<br />
* Java 1.3 uses major version 47<br />
* Java 1.4 uses major version 48<br />
* Java 5 uses major version 49<br />
* Java 6 uses major version 50</p>
<p><i><br />
EOF ( End Of Fun)<br />
Özcan Acar<br />
</i></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2010%2F05%2F26%2Fjava-compiler-versiyonu%2F&amp;linkname=Java%20Compiler%20Versiyonu"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2010/05/26/java-compiler-versiyonu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java&#8217;da Finalizer Metodu</title>
		<link>http://www.kurumsaljava.com/2010/02/23/javada-finalizer-metodu/</link>
		<comments>http://www.kurumsaljava.com/2010/02/23/javada-finalizer-metodu/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 11:39:23 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Püf Noktası]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1098</guid>
		<description><![CDATA[<p>Java_tr grubunda aşağıdaki yer alan soru soruldu. Bu soru ve benim bu konudaki düşüncelerim aşağıda yer almaktadır.</p>
<p><i>Java&#8217;da bulmaca sevenlere; Aşağıda ki kod parçası için çıktı ne olur,<br />
&#8220;finalized&#8221; yazar mı? Constructor&#8217;ýnda exception fırlatmış bir nesnenin<br />
finalize işleminden geçmesini bekler misiniz?<br />
</i></p>
<pre name="code" class="java">

public class FinalizerTest {

&lt;span id=&quot;more-1098&quot;&gt;&lt;/span&gt;

  public FinalizerTest() {
    System.out.println(&quot;constructed&quot;);
    throw new RuntimeException();
  }

  protected void finalize() throws Throwable {
    System.out.println(&quot;finalized&quot;);
  }

  public static void main(String[] args) {
    try {
      new FinalizerTest();
    } catch (Exception e) {
      System.out.println(&quot;exception&quot;);
    }
    System.gc();
  }
}
</pre>
<p>Benim verdiğim cevap şu şekildedir:</p>
<p><i><br />
Java&#8217;da <i>finalize()</i> kullanılması doğru değildir, çünkü JVM&#8217;in finalize metodunu ne zaman koşturacağını kestirmek mümkün değildir. Buna güvenerek örneğin finalize() içinde kullanılan kaynakları serbest bırakmak yapılabilecek en büyük hatalardan birisidir. Pratikte finalize() metodu kesinlikle kullanmamalıdır. Finalizer kullanımı performansı düşürür. Finalizer ile nesnenin yok edilmesi daha uzun zaman alır. Finalize yerine bir terminasyon metodu kullanılmalıdır. <i>gc()</i> metodunun kullanımı da GC nin hemen devreye gireceği garantisini vermez.</p>
<p>Yukarıda yer alan programın konstruktöründe try catch ile hata yakalanarak, daha önce bahsettiğim terminasyon metodu (örneğin <i>myExit()</i>)  koşturulmalıdır.<br />
</i></p>
<p><i><br />
EOF ( End Of Fun)<br />
Özcan Acar<br />
</i></p>
]]></description>
			<content:encoded><![CDATA[<p>Java_tr grubunda aşağıdaki yer alan soru soruldu. Bu soru ve benim bu konudaki düşüncelerim aşağıda yer almaktadır.</p>
<p><i>Java&#8217;da bulmaca sevenlere; Aşağıda ki kod parçası için çıktı ne olur,<br />
&#8220;finalized&#8221; yazar mı? Constructor&#8217;ýnda exception fırlatmış bir nesnenin<br />
finalize işleminden geçmesini bekler misiniz?<br />
</i></p>
<pre name="code" class="java">

public class FinalizerTest {

&lt;span id=&quot;more-1098&quot;&gt;&lt;/span&gt;

  public FinalizerTest() {
    System.out.println(&quot;constructed&quot;);
    throw new RuntimeException();
  }

  protected void finalize() throws Throwable {
    System.out.println(&quot;finalized&quot;);
  }

  public static void main(String[] args) {
    try {
      new FinalizerTest();
    } catch (Exception e) {
      System.out.println(&quot;exception&quot;);
    }
    System.gc();
  }
}
</pre>
<p>Benim verdiğim cevap şu şekildedir:</p>
<p><i><br />
Java&#8217;da <i>finalize()</i> kullanılması doğru değildir, çünkü JVM&#8217;in finalize metodunu ne zaman koşturacağını kestirmek mümkün değildir. Buna güvenerek örneğin finalize() içinde kullanılan kaynakları serbest bırakmak yapılabilecek en büyük hatalardan birisidir. Pratikte finalize() metodu kesinlikle kullanmamalıdır. Finalizer kullanımı performansı düşürür. Finalizer ile nesnenin yok edilmesi daha uzun zaman alır. Finalize yerine bir terminasyon metodu kullanılmalıdır. <i>gc()</i> metodunun kullanımı da GC nin hemen devreye gireceği garantisini vermez.</p>
<p>Yukarıda yer alan programın konstruktöründe try catch ile hata yakalanarak, daha önce bahsettiğim terminasyon metodu (örneğin <i>myExit()</i>)  koşturulmalıdır.<br />
</i></p>
<p><i><br />
EOF ( End Of Fun)<br />
Özcan Acar<br />
</i></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2010%2F02%2F23%2Fjavada-finalizer-metodu%2F&amp;linkname=Java%26%238217%3Bda%20Finalizer%20Metodu"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2010/02/23/javada-finalizer-metodu/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Java&#8217;da Final Anahtar Kelimesi</title>
		<link>http://www.kurumsaljava.com/2010/02/18/javada-final-anahtar-kelimesi/</link>
		<comments>http://www.kurumsaljava.com/2010/02/18/javada-final-anahtar-kelimesi/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 23:21:14 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Püf Noktası]]></category>
		<category><![CDATA[Final]]></category>
		<category><![CDATA[Java Keyword]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1093</guid>
		<description><![CDATA[<p>Java&#8217;da <b>final</b> anahtar kelimesi aşağıda yer alan yapılar için kullanılabilir:</p>
<ul>
<li><b>Final sınıf değişkenleri</b>: Final olan bir sınıf değişkenine sadece bir kere değer ataması yapilabilir ve bu atama sadece sınıf konstrüktöründe gerçekleşebilir.</li>
<li><b>Final metot parametreleri</b>: Final olarak tanımlanmış bir metot parametresine sadece bir kere değer atanabilir. Metot parametrelerinin tamamen final olarak tanımlamış olmalarında büyük fayda vardır. Bu şekilde parametrenin metot bünyesinde değişikliğe ugrama tehlikesi ortadan kaldırılmış olur.</li>
<li><b>Final metotlar</b>: Final olan bir metot ne alt sınıflarca yeniden yüklenebilir (method overloading) ne de saklı (hidden) tutulabilir.</li>
<li><b>Final sınıflar</b>: Final olan bir sınıf genişletilerek bir alt sınıf oluşturulamaz.</li>
</ul>
<p><span id="more-1093"></span></p>
<p>Final anahtar kelimesi Java programcılığında en çok göz ardı edilenlerdendir. En son siz ne zaman final anahtar kelimesini kullandınız?<br />
Final anahtar kelimesi programın daha doğru, hatalara dayanıklı ve performanslı çalışmasını sağlar.</p>
<p>Final anahtar kelimesinin kullanımında yapılan en büyük hatalardan birisi final static olarak tanımlanmış olan bir sınıf değişkenine değistirilebilir bir değerin atanmasıdır. Örneğin aşağıdaki tanımlama yanlıştır, çünkü static değişken final olmasına rağmen, bu değişkene atanan değer, kullanıcı tarafından değiştirilebilir.</p>
<pre name="code" class="java">

public class App
{
    public static final String[] LIST = {&quot;1&quot;,&quot;2&quot;,&quot;3&quot;};

    public static void main(String[] args)
    {
	String[] list = App.LIST;
	list[0] = &quot;2&quot;;
	System.out.println(App.LIST[0]);
    }
}
</pre>
<p>Yukarda yer alan main() metodunda final olan LIST degiskeninin ihtiva ettiği array değiştirilmektedir. Bu sorunu ortadan kaldırmak için LIST değişkeni private yapılabilir ve bu değişkeni baz alarak içeriğinin değiştirilemeyeceği bir array değerini geri döndüren metot oluşturulabilir. Bunun bir örneği aşağıda yer almaktadır:</p>
<pre name="code" class="java">

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class App
{
    private static final String[] LIST = {&quot;1&quot;,&quot;2&quot;,&quot;3&quot;};

    public static final List&lt;String&gt; getList()
    {
	return Collections.unmodifiableList(Arrays.asList(App.LIST));
    }

    public static void main(String[] args)
    {
	List&lt;String&gt; list = App.getList();
	list.remove(0);
	System.out.println(list);
    }
}
</pre>
<p>Bu program koşturulduğunda alınacak hata şu şekildedır:</p>
<p><b><br />
Exception in thread &#8220;main&#8221; java.lang.UnsupportedOperationException<br />
	at java.util.Collections$UnmodifiableList.remove(Collections.java:1162)<br />
	at test.App.main(App.java:22)<br />
</b></p>
<p>Bu şekilde final olarak tanımladığımız LIST değişkenin ihtiva ettiği değerleri üzerinde oynama yapmak mümkün değildir. getList() metodu bünyesinde Collections.unmodifiableList() ile içeriğinin değiştirilmesi mümkün olmayan bir liste oluşturulmaktadır.</p>
<p><i><br />
EOF ( End Of Fun)<br />
Özcan Acar<br />
</i></p>
]]></description>
			<content:encoded><![CDATA[<p>Java&#8217;da <b>final</b> anahtar kelimesi aşağıda yer alan yapılar için kullanılabilir:</p>
<ul>
<li><b>Final sınıf değişkenleri</b>: Final olan bir sınıf değişkenine sadece bir kere değer ataması yapilabilir ve bu atama sadece sınıf konstrüktöründe gerçekleşebilir.</li>
<li><b>Final metot parametreleri</b>: Final olarak tanımlanmış bir metot parametresine sadece bir kere değer atanabilir. Metot parametrelerinin tamamen final olarak tanımlamış olmalarında büyük fayda vardır. Bu şekilde parametrenin metot bünyesinde değişikliğe ugrama tehlikesi ortadan kaldırılmış olur.</li>
<li><b>Final metotlar</b>: Final olan bir metot ne alt sınıflarca yeniden yüklenebilir (method overloading) ne de saklı (hidden) tutulabilir.</li>
<li><b>Final sınıflar</b>: Final olan bir sınıf genişletilerek bir alt sınıf oluşturulamaz.</li>
</ul>
<p><span id="more-1093"></span></p>
<p>Final anahtar kelimesi Java programcılığında en çok göz ardı edilenlerdendir. En son siz ne zaman final anahtar kelimesini kullandınız?<br />
Final anahtar kelimesi programın daha doğru, hatalara dayanıklı ve performanslı çalışmasını sağlar.</p>
<p>Final anahtar kelimesinin kullanımında yapılan en büyük hatalardan birisi final static olarak tanımlanmış olan bir sınıf değişkenine değistirilebilir bir değerin atanmasıdır. Örneğin aşağıdaki tanımlama yanlıştır, çünkü static değişken final olmasına rağmen, bu değişkene atanan değer, kullanıcı tarafından değiştirilebilir.</p>
<pre name="code" class="java">

public class App
{
    public static final String[] LIST = {&quot;1&quot;,&quot;2&quot;,&quot;3&quot;};

    public static void main(String[] args)
    {
	String[] list = App.LIST;
	list[0] = &quot;2&quot;;
	System.out.println(App.LIST[0]);
    }
}
</pre>
<p>Yukarda yer alan main() metodunda final olan LIST degiskeninin ihtiva ettiği array değiştirilmektedir. Bu sorunu ortadan kaldırmak için LIST değişkeni private yapılabilir ve bu değişkeni baz alarak içeriğinin değiştirilemeyeceği bir array değerini geri döndüren metot oluşturulabilir. Bunun bir örneği aşağıda yer almaktadır:</p>
<pre name="code" class="java">

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class App
{
    private static final String[] LIST = {&quot;1&quot;,&quot;2&quot;,&quot;3&quot;};

    public static final List&lt;String&gt; getList()
    {
	return Collections.unmodifiableList(Arrays.asList(App.LIST));
    }

    public static void main(String[] args)
    {
	List&lt;String&gt; list = App.getList();
	list.remove(0);
	System.out.println(list);
    }
}
</pre>
<p>Bu program koşturulduğunda alınacak hata şu şekildedır:</p>
<p><b><br />
Exception in thread &#8220;main&#8221; java.lang.UnsupportedOperationException<br />
	at java.util.Collections$UnmodifiableList.remove(Collections.java:1162)<br />
	at test.App.main(App.java:22)<br />
</b></p>
<p>Bu şekilde final olarak tanımladığımız LIST değişkenin ihtiva ettiği değerleri üzerinde oynama yapmak mümkün değildir. getList() metodu bünyesinde Collections.unmodifiableList() ile içeriğinin değiştirilmesi mümkün olmayan bir liste oluşturulmaktadır.</p>
<p><i><br />
EOF ( End Of Fun)<br />
Özcan Acar<br />
</i></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2010%2F02%2F18%2Fjavada-final-anahtar-kelimesi%2F&amp;linkname=Java%26%238217%3Bda%20Final%20Anahtar%20Kelimesi"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2010/02/18/javada-final-anahtar-kelimesi/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Covariant Return Types</title>
		<link>http://www.kurumsaljava.com/2010/02/06/covariant-return-types/</link>
		<comments>http://www.kurumsaljava.com/2010/02/06/covariant-return-types/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 10:22:21 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Püf Noktası]]></category>
		<category><![CDATA[Covariant Return Type]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1078</guid>
		<description><![CDATA[<p>Java 1.5 ile kullanıma sunulan ve <strong>covariant return type</strong> ismini taşıyan bir yapı mevcuttur. Java 1.5 öncesi bir alt sınıf, bir üst sınıfın sahip olduğu metodu yeniden implemente etmek (method overriding) istediginde, bu metodun geri döndürdüğü veri tipinin, üst sınıftaki metot ile aynı olması gerekmekteydi. Bunun bir örneği aşağıda yer almaktadır.</p>
<p><span id="more-1078"></span></p>
<pre name="code" class="java">

package test.controller;

import java.util.Map;

import test.criteria.Criteria;

public abstract class AbstractController implements Controller
{
    public void executeFilter()
    {
	Map&lt;String, String&gt; map = createCriteria().getCriteriaMap();

    }

    public abstract Criteria createCriteria();
}
</pre>
<p>Soyut (abstract) olan <i>AbstractController</i> sınıfı bünyesinde, alt sınıflarda implemente edilmek üzere <i>createCriteria()</i> isminde bir metot tanımlıyoruz. <i>AccountTableController</i> sınıfı bu metodu implemente etmektedir.</p>
<pre name="code" class="java">

package test.controller;

import java.util.HashMap;
import java.util.Map;

import test.criteria.MyCriteria;
import test.model.Konto;

public class AccountTableController extends AbstractController
{
    private Account model = new Account();

    public Criteria createCriteria()
    {
	Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();
	map.put(&quot;kontonr&quot;, model.getKontonr());
	map.put(&quot;blz&quot;, model.getBlz());
	return new Criteria(map);
    }
}
</pre>
<p>Görüldüğü gibi <i>AccountTableController.createCriteria()</i> metodu <i>Criteria</i> tipinde bir degeri geri döndürmektedir. Bu metodun geri döndürdüğü değerin Java 1.5 öncesi <i>Criteria</i> tipinde olması gerekmektedir, çünkü üst sınıfta tanımlanmış olan bu metodun, üst sınıf bünyesinde geri döndürdüğü değer <i>Criteria</i> tipindedir.</p>
<p>Java 1.5 ile bu durum değişmiştir. Üst sınıfta yer alan bir metot alt sınıfta tekrar reimplement edilirse (method overriding), reimplemente edilen metodun geri döndürdüğü değerin tipi, üst sınıftaki metodun geri döndürdüğü sınıfın bir alt sınıfı olabilir. Bunun bir örneği aşağıda yer almaktadır.</p>
<pre name="code" class="java">

package test.controller;

import java.util.HashMap;
import java.util.Map;

import test.criteria.MyCriteria;
import test.model.Konto;

public class AccountTableController extends AbstractController
{
    private Account model = new Account();

    @Override
    public MyCriteria createCriteria()
    {
	Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();
	map.put(&quot;kontonr&quot;, model.getKontonr());
	map.put(&quot;blz&quot;, model.getBlz());
	return new MyCriteria(map);
    }
}
</pre>
<p><i>MyCriteria</i>, <i>Criteria</i> sınıfının bir alt sınıfıdır ve <i>AccountTableController</i> sınıfı implemente ettiği <i>createCriteria()</i> metodunun <i>MyCriteria</i> tipinde bir değeri geri döndürmesi sağlamıştır. Bu şekilde cast işlemi yapılmadan alt sınıfların daha zengin tipte verileri geri döndürebilmeleri amaçlanmaktadır.</p>
<p><i><br />
EOF ( End Of Fun)<br />
Özcan Acar</i></p>
]]></description>
			<content:encoded><![CDATA[<p>Java 1.5 ile kullanıma sunulan ve <strong>covariant return type</strong> ismini taşıyan bir yapı mevcuttur. Java 1.5 öncesi bir alt sınıf, bir üst sınıfın sahip olduğu metodu yeniden implemente etmek (method overriding) istediginde, bu metodun geri döndürdüğü veri tipinin, üst sınıftaki metot ile aynı olması gerekmekteydi. Bunun bir örneği aşağıda yer almaktadır.</p>
<p><span id="more-1078"></span></p>
<pre name="code" class="java">

package test.controller;

import java.util.Map;

import test.criteria.Criteria;

public abstract class AbstractController implements Controller
{
    public void executeFilter()
    {
	Map&lt;String, String&gt; map = createCriteria().getCriteriaMap();

    }

    public abstract Criteria createCriteria();
}
</pre>
<p>Soyut (abstract) olan <i>AbstractController</i> sınıfı bünyesinde, alt sınıflarda implemente edilmek üzere <i>createCriteria()</i> isminde bir metot tanımlıyoruz. <i>AccountTableController</i> sınıfı bu metodu implemente etmektedir.</p>
<pre name="code" class="java">

package test.controller;

import java.util.HashMap;
import java.util.Map;

import test.criteria.MyCriteria;
import test.model.Konto;

public class AccountTableController extends AbstractController
{
    private Account model = new Account();

    public Criteria createCriteria()
    {
	Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();
	map.put(&quot;kontonr&quot;, model.getKontonr());
	map.put(&quot;blz&quot;, model.getBlz());
	return new Criteria(map);
    }
}
</pre>
<p>Görüldüğü gibi <i>AccountTableController.createCriteria()</i> metodu <i>Criteria</i> tipinde bir degeri geri döndürmektedir. Bu metodun geri döndürdüğü değerin Java 1.5 öncesi <i>Criteria</i> tipinde olması gerekmektedir, çünkü üst sınıfta tanımlanmış olan bu metodun, üst sınıf bünyesinde geri döndürdüğü değer <i>Criteria</i> tipindedir.</p>
<p>Java 1.5 ile bu durum değişmiştir. Üst sınıfta yer alan bir metot alt sınıfta tekrar reimplement edilirse (method overriding), reimplemente edilen metodun geri döndürdüğü değerin tipi, üst sınıftaki metodun geri döndürdüğü sınıfın bir alt sınıfı olabilir. Bunun bir örneği aşağıda yer almaktadır.</p>
<pre name="code" class="java">

package test.controller;

import java.util.HashMap;
import java.util.Map;

import test.criteria.MyCriteria;
import test.model.Konto;

public class AccountTableController extends AbstractController
{
    private Account model = new Account();

    @Override
    public MyCriteria createCriteria()
    {
	Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();
	map.put(&quot;kontonr&quot;, model.getKontonr());
	map.put(&quot;blz&quot;, model.getBlz());
	return new MyCriteria(map);
    }
}
</pre>
<p><i>MyCriteria</i>, <i>Criteria</i> sınıfının bir alt sınıfıdır ve <i>AccountTableController</i> sınıfı implemente ettiği <i>createCriteria()</i> metodunun <i>MyCriteria</i> tipinde bir değeri geri döndürmesi sağlamıştır. Bu şekilde cast işlemi yapılmadan alt sınıfların daha zengin tipte verileri geri döndürebilmeleri amaçlanmaktadır.</p>
<p><i><br />
EOF ( End Of Fun)<br />
Özcan Acar</i></p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2010%2F02%2F06%2Fcovariant-return-types%2F&amp;linkname=Covariant%20Return%20Types"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2010/02/06/covariant-return-types/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java Enum ile Singleton Tasarım Şablonu</title>
		<link>http://www.kurumsaljava.com/2010/02/02/java-enum-ile-singleton-tasarim-sablonu/</link>
		<comments>http://www.kurumsaljava.com/2010/02/02/java-enum-ile-singleton-tasarim-sablonu/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 08:32:42 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Püf Noktası]]></category>
		<category><![CDATA[Tasarım Şablonları (Design Patterns)]]></category>
		<category><![CDATA[Enum]]></category>
		<category><![CDATA[Singleton]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1067</guid>
		<description><![CDATA[<p>Daha önceki bir yazımda <a href="http://www.kurumsaljava.com/2008/11/27/singleton-yanlizlik-tasarim-sablonu/" target="_blank">Singleton tasarım şablonunun</a> ne olduğunu ve Java&#8217;da nasıl kullanıldığını yakından incelemiştik. Bu yazımda Java 1.5 den itibaren kullanıma sunulan <i>Enum</i> sınıfı ile singleton tasarım şablonunun nasıl kullanılabileceğine değinmek istiyorum.</p>
<p><span id="more-1067"></span></p>
<p>Öncelikle küçük bir örnek üzerinde singleton bir nesnesinin nasıl oluşturulacağına bir göz atalım:</p>
<pre name="code" class="java">

package com.kurumsaljava.com.designpatterns.singleton;

public class MySingleton
{
    private static final MySingleton instance = new MySingleton();

    private MySingleton()
    {
    }

    public void myMethod()
    {

    }
}
</pre>
<p><i>MySingleton</i> sınıfının sahip olduğu konstruktör <i>private</i> olduğu için bu sınıftan bir nesne oluşturmamız mümkün değildir. Bu sınıf bünyesinde ve <i>MySingleton</i> tipinde olan <i>instance</i> ismindeki sınıf değişkeni singleton nesnedir. Bu sınıf ilk kullanıldığında <i>private</i> olan konstruktör bir defaya mahsus olarak işlem göreceği için <i>instance</i> degişkeni bir singleton nesne haline gelecektir. Buradaki sorun, reflection yöntemleri kullanılarak <i>private</i> olan konstruktörün birden fazla singleton nesne oluşturmasını sağlayabilmektir. Bunun yanısıra eger <i>MySingleton</i> sınıfı <i>Serializable</i> interface sınıfını implemente ediyorsa, <b><i>readResolve()</i></b> metodunun da implemente edilmesi gerekmektedir, aksi taktirde deserializasyon esnasında yeni bir nesne oluşturulur ki, bu da singleton tasarım şablonunun mantığına ters düşer.</p>
<p>Java 1.5 den itibaren kullanıma sunulan <i>Enum</i> sınıfı ile singleton nesneler oluşturmak mümkündür. Bunun bir örneği aşağıda yer almaktadır.</p>
<pre name="code" class="java">

package com.kurumsaljava.com.designpatterns.singleton;

public enum MySingletonEnum
{
    INSTANCE;

    public void myMethod()
    {

    }
}
</pre>
<p><i>MySingletionEnum.INSTANCE</i> sadece ve sadece bir kere mevcut olan bir singleton değişkendir. Bunun yanısıra reflection metotları kullanılarak yeni bir singleton olmayan nesne oluşturulamaz. Ayrıca serializasyon işlemlerinde <i>readResolve()</i> kullanılmak zorunda kalmadan enum nesnesinin singletonluğu garanti edilmektedir. Tek elementli olan bir enum sınıfı singleton tasarım şablonunu implemente etmek i.in kullanılabilecek en iyi yöntemdir.</p>
]]></description>
			<content:encoded><![CDATA[<p>Daha önceki bir yazımda <a href="http://www.kurumsaljava.com/2008/11/27/singleton-yanlizlik-tasarim-sablonu/" target="_blank">Singleton tasarım şablonunun</a> ne olduğunu ve Java&#8217;da nasıl kullanıldığını yakından incelemiştik. Bu yazımda Java 1.5 den itibaren kullanıma sunulan <i>Enum</i> sınıfı ile singleton tasarım şablonunun nasıl kullanılabileceğine değinmek istiyorum.</p>
<p><span id="more-1067"></span></p>
<p>Öncelikle küçük bir örnek üzerinde singleton bir nesnesinin nasıl oluşturulacağına bir göz atalım:</p>
<pre name="code" class="java">

package com.kurumsaljava.com.designpatterns.singleton;

public class MySingleton
{
    private static final MySingleton instance = new MySingleton();

    private MySingleton()
    {
    }

    public void myMethod()
    {

    }
}
</pre>
<p><i>MySingleton</i> sınıfının sahip olduğu konstruktör <i>private</i> olduğu için bu sınıftan bir nesne oluşturmamız mümkün değildir. Bu sınıf bünyesinde ve <i>MySingleton</i> tipinde olan <i>instance</i> ismindeki sınıf değişkeni singleton nesnedir. Bu sınıf ilk kullanıldığında <i>private</i> olan konstruktör bir defaya mahsus olarak işlem göreceği için <i>instance</i> degişkeni bir singleton nesne haline gelecektir. Buradaki sorun, reflection yöntemleri kullanılarak <i>private</i> olan konstruktörün birden fazla singleton nesne oluşturmasını sağlayabilmektir. Bunun yanısıra eger <i>MySingleton</i> sınıfı <i>Serializable</i> interface sınıfını implemente ediyorsa, <b><i>readResolve()</i></b> metodunun da implemente edilmesi gerekmektedir, aksi taktirde deserializasyon esnasında yeni bir nesne oluşturulur ki, bu da singleton tasarım şablonunun mantığına ters düşer.</p>
<p>Java 1.5 den itibaren kullanıma sunulan <i>Enum</i> sınıfı ile singleton nesneler oluşturmak mümkündür. Bunun bir örneği aşağıda yer almaktadır.</p>
<pre name="code" class="java">

package com.kurumsaljava.com.designpatterns.singleton;

public enum MySingletonEnum
{
    INSTANCE;

    public void myMethod()
    {

    }
}
</pre>
<p><i>MySingletionEnum.INSTANCE</i> sadece ve sadece bir kere mevcut olan bir singleton değişkendir. Bunun yanısıra reflection metotları kullanılarak yeni bir singleton olmayan nesne oluşturulamaz. Ayrıca serializasyon işlemlerinde <i>readResolve()</i> kullanılmak zorunda kalmadan enum nesnesinin singletonluğu garanti edilmektedir. Tek elementli olan bir enum sınıfı singleton tasarım şablonunu implemente etmek i.in kullanılabilecek en iyi yöntemdir.</p>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2010%2F02%2F02%2Fjava-enum-ile-singleton-tasarim-sablonu%2F&amp;linkname=Java%20Enum%20ile%20Singleton%20Tasar%C4%B1m%20%C5%9Eablonu"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2010/02/02/java-enum-ile-singleton-tasarim-sablonu/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>DBUnit JUnit Entegrasyonu</title>
		<link>http://www.kurumsaljava.com/2010/01/15/dbunit-junit-entegrasyonu/</link>
		<comments>http://www.kurumsaljava.com/2010/01/15/dbunit-junit-entegrasyonu/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 15:48:47 +0000</pubDate>
		<dc:creator>Özcan Acar</dc:creator>
				<category><![CDATA[Püf Noktası]]></category>
		<category><![CDATA[DBUnit]]></category>
		<category><![CDATA[Junit]]></category>

		<guid isPermaLink="false">http://www.kurumsaljava.com/?p=1049</guid>
		<description><![CDATA[<p><a href="http://www.dbunit.org" target="_blank">DBUnit</a> JUnit ile entegre edilerek <a href="http://www.kurumsaljava.com/download/8/">entegrasyon ve regresyon testlerinin</a> JUnit testleri olarak implemente edilmesi mümkündür. DBUnit JUnit entegrasyonu aşağıdaki şekilde gerçekleştirilebilir. Bilgibankası olarak örnekte HSQLDB kullanılmıştır (bakınız <a href="http://www.kurumsaljava.com/2010/01/15/hsqldb-ve-junit-entegrasyonu/" target=_blank>HSQLDB JUnit entegrasyonu</a>). Verilerin <b>dbunit-dataset.xml</b> dosyasında tanımlanmıs olması gerekmektedir. <b>setUp()</b> metodu her test öncesi JUnit frameworkü tarafından koşturulacağı için istenilen veriler test öncesi bilgibankasına eklenmiş ve regresyon testleri için taban oluşturulmuş olacaktır.</p>
<p><span id="more-1049"></span></p>
<pre name="code" class="java">

// JDBC Driver
    public static final String DRIVERCLASS      = &quot;org.hsqldb.jdbcDriver&quot;;
    // standalone mode
    public static final String CONNECTIONURL    = &quot;jdbc:hsqldb:hsql://localhost:9006/mydb&quot;;
    public static final String USERNAME         = &quot;sa&quot;;
    public static final String PASSWORD         = &quot;&quot;;

public void setUp() throws Exception
	{
		PreparedStatement pstmt = null;

		 try
		 {
			IDatabaseConnection connection = getConnection();
			IDataSet dataSet = getDataSet();
			try
			{
				// REF INTEGRITY MUST BE DISABLED IN ORDER TO IMPORT THE DATA
				// THIS SOLUTION IS ONLY VALID FOR HSQLDB 1.8
				pstmt = connection.getConnection().prepareStatement(&quot;set referential_integrity FALSE&quot;);
				pstmt.executeUpdate();
				DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
				pstmt = connection.getConnection().prepareStatement(&quot;set referential_integrity TRUE&quot;);
				pstmt.executeUpdate();
			}
			finally
			{
				connection.close();
			}
		}
		catch (Exception e)
		{
		    throw e;
		}
	}

	protected IDatabaseConnection getConnection() throws Exception
	{
		Class.forName(DRIVERCLASS);
		Connection jdbcConnection = DriverManager.getConnection(CONNECTIONURL, USERNAME, PASSWORD);
		IDatabaseConnection con =  new DatabaseConnection(jdbcConnection);
		DatabaseConfig config = con.getConfig();
		config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new HsqldbDataTypeFactory());
		return con;
	}

protected final IDataSet getDataSet() throws Exception
	{
		final URL url = DatabaseTestCase.class.getResource( &quot;/dbunit-dataset.xml&quot;);
	    final File file = new File(url.getPath());
	    return new FlatXmlDataSet(file);
	}
</pre>
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.dbunit.org" target="_blank">DBUnit</a> JUnit ile entegre edilerek <a href="http://www.kurumsaljava.com/download/8/">entegrasyon ve regresyon testlerinin</a> JUnit testleri olarak implemente edilmesi mümkündür. DBUnit JUnit entegrasyonu aşağıdaki şekilde gerçekleştirilebilir. Bilgibankası olarak örnekte HSQLDB kullanılmıştır (bakınız <a href="http://www.kurumsaljava.com/2010/01/15/hsqldb-ve-junit-entegrasyonu/" target=_blank>HSQLDB JUnit entegrasyonu</a>). Verilerin <b>dbunit-dataset.xml</b> dosyasında tanımlanmıs olması gerekmektedir. <b>setUp()</b> metodu her test öncesi JUnit frameworkü tarafından koşturulacağı için istenilen veriler test öncesi bilgibankasına eklenmiş ve regresyon testleri için taban oluşturulmuş olacaktır.</p>
<p><span id="more-1049"></span></p>
<pre name="code" class="java">

// JDBC Driver
    public static final String DRIVERCLASS      = &quot;org.hsqldb.jdbcDriver&quot;;
    // standalone mode
    public static final String CONNECTIONURL    = &quot;jdbc:hsqldb:hsql://localhost:9006/mydb&quot;;
    public static final String USERNAME         = &quot;sa&quot;;
    public static final String PASSWORD         = &quot;&quot;;

public void setUp() throws Exception
	{
		PreparedStatement pstmt = null;

		 try
		 {
			IDatabaseConnection connection = getConnection();
			IDataSet dataSet = getDataSet();
			try
			{
				// REF INTEGRITY MUST BE DISABLED IN ORDER TO IMPORT THE DATA
				// THIS SOLUTION IS ONLY VALID FOR HSQLDB 1.8
				pstmt = connection.getConnection().prepareStatement(&quot;set referential_integrity FALSE&quot;);
				pstmt.executeUpdate();
				DatabaseOperation.CLEAN_INSERT.execute(connection, dataSet);
				pstmt = connection.getConnection().prepareStatement(&quot;set referential_integrity TRUE&quot;);
				pstmt.executeUpdate();
			}
			finally
			{
				connection.close();
			}
		}
		catch (Exception e)
		{
		    throw e;
		}
	}

	protected IDatabaseConnection getConnection() throws Exception
	{
		Class.forName(DRIVERCLASS);
		Connection jdbcConnection = DriverManager.getConnection(CONNECTIONURL, USERNAME, PASSWORD);
		IDatabaseConnection con =  new DatabaseConnection(jdbcConnection);
		DatabaseConfig config = con.getConfig();
		config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, new HsqldbDataTypeFactory());
		return con;
	}

protected final IDataSet getDataSet() throws Exception
	{
		final URL url = DatabaseTestCase.class.getResource( &quot;/dbunit-dataset.xml&quot;);
	    final File file = new File(url.getPath());
	    return new FlatXmlDataSet(file);
	}
</pre>
<a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?linkurl=http%3A%2F%2Fwww.kurumsaljava.com%2F2010%2F01%2F15%2Fdbunit-junit-entegrasyonu%2F&amp;linkname=DBUnit%20JUnit%20Entegrasyonu"><img src="http://www.kurumsaljava.com/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Bookmark"/></a>]]></content:encoded>
			<wfw:commentRss>http://www.kurumsaljava.com/2010/01/15/dbunit-junit-entegrasyonu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

