<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>OOPCLASS2008 &#187; Kuliah</title>
	<atom:link href="http://oopclass2008.wordpress.com/category/kuliah/feed/" rel="self" type="application/rss+xml" />
	<link>http://oopclass2008.wordpress.com</link>
	<description>Object-Oriented Experiences</description>
	<lastBuildDate>Tue, 09 Dec 2008 18:34:34 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='oopclass2008.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/b2b359fbc8ab70c2094e85c853e43d4b?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>OOPCLASS2008 &#187; Kuliah</title>
		<link>http://oopclass2008.wordpress.com</link>
	</image>
			<item>
		<title>Singleton Pattern (Print Spooler)</title>
		<link>http://oopclass2008.wordpress.com/2008/12/09/singleton-pattern-print-spooler/</link>
		<comments>http://oopclass2008.wordpress.com/2008/12/09/singleton-pattern-print-spooler/#comments</comments>
		<pubDate>Tue, 09 Dec 2008 18:15:57 +0000</pubDate>
		<dc:creator>oopclass2008</dc:creator>
				<category><![CDATA[Kuliah]]></category>

		<guid isPermaLink="false">http://oopclass2008.wordpress.com/?p=215</guid>
		<description><![CDATA[Kali ini, kita ingin meng-explore lagi Singleton Pattern. Soalnya, kita baru saja menemukan buku online yang bagus tentang design pattern. Judulnya Design Patterns Java Companion. Bisa dilihat di sini.  Kita cari-cari bab tentang Singleton Pattern dan menemukan implementasi Singleton Pattern yang berbeda dengan implementasi sebelumnya. 
Pada postingan lalu, kita menggunakan static method getInstance() untuk [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oopclass2008.wordpress.com&blog=4788351&post=215&subd=oopclass2008&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Kali ini, kita ingin meng-explore lagi <strong>Singleton Pattern</strong>. Soalnya, kita baru saja menemukan buku online yang bagus tentang design pattern. Judulnya <strong>Design Patterns Java Companion</strong>. Bisa dilihat <a href="http://www.patterndepot.com/put/8/JavaPatterns.htm">di sini</a>.  Kita cari-cari bab tentang Singleton Pattern dan menemukan implementasi Singleton Pattern yang berbeda dengan implementasi sebelumnya. </p>
<p>Pada postingan lalu, kita menggunakan <strong>static method getInstance()</strong> untuk mengontrol pembuatan instance. Tetapi, di buku tersebut digunakan <strong>Exception</strong> ketika Singleton di-instance lebih dari satu. Wah, menarik juga nih. Apalagi memakai contoh <strong>Print Spooler</strong>. Kita sudah menyebutkan Print Spooler di postingan sebelumnya.</p>
<p><em>Let&#8217;s start</em> &#8230;</p>
<p>Pertama-tama, dibuat dulu kelas exception kita seperti ini:</p>
<pre class="brush: java;">public class SingletonException extends RuntimeException { 

   //Tipe exception untuk kelas Singleton
   public SingletonException() {
      super();
   } 

   public SingletonException(String s) {
      super(s);
   }
}
</pre>
<p>Kelas exception ini memanggil parent class lewat <strong>method super()</strong>. Tetapi selain itu, kelas ini tidak melakukan sesuatu yang khusus. Kelas ini dibuat supaya kita mempunyai tipe exception sendiri yang harus kita <em>catch</em> ketika mencoba membuat instance dari PrintSpooler.</p>
<p>Selanjutnya, kita buat kelas PrintSpooler. </p>
<pre class="brush: java;">public class PrintSpooler { 

   // true jika terdapat satu instance
   static boolean instance_flag=false; 

   public PrintSpooler() throws SingletonException { 

   	if (instance_flag) {
      		throw new SingletonException(&quot;Hanya satu spooler yang diijinkan&quot;);
   	} else {
      		instance_flag = true;
      		System.out.println(&quot;spooler di-open&quot;);
   	}
   }	

   //-------------------------------------------
   public void finalize() {
      instance_flag = false;
   }
}
</pre>
<p>Kelas PrintSpooler menggunakan static flag untuk mengecek apakah sudah ada instance atau belum. Bila sudah ada, maka akan men-throw exception. Bila belum, maka instance spooler bisa dibuat.</p>
<p>Di kelas tersebut, tidak diikutsertakan method-method printing. Kita cuma lihat implementasi Singleton-nya saja. Kita tidak berniat membuat Print Spooler betulan hi..hi..hi <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Sekarang, seperti biasa, kita coba kelas PrintSpooler dengan menggunakan kelas tester singleSpooler. Kita lihat apakah dapat memunculkan efek singleton.</p>
<pre class="brush: java;">public class singleSpooler {

      static public void main(String argv[]) {

      PrintSpooler pr1, pr2; 

      // open satu spooler
      // pasti berhasil
      System.out.println(&quot;Open satu spooler&quot;);
      try {
      	pr1 = new PrintSpooler();
      } catch (SingletonException e) {
	      System.out.println(e.getMessage());
      } 

      // open spooler yang lain
      // harusnya tidak bisa
      System.out.println(&quot;Open dua spooler&quot;);

      try {
      	pr2 = new PrintSpooler();
      } catch (SingletonException e) {
	      System.out.println(e.getMessage());
      }
   }
}
</pre>
<p>Kita compile, jalankan, dan hasilnya &#8230;<br />
<img src="http://oopclass2008.files.wordpress.com/2008/12/picture-16.png?w=500&#038;h=145" alt="picture-16" title="picture-16" width="500" height="145" class="alignnone size-full wp-image-216" /><br />
Baris terakhir mengindikasikan exception <em>di-throw</em> ketika kita mencoba membuat instance baru, padahal sudah ada instance PrintSpooler sebelumnya. <strong>Mission Accomplished!</strong> hi..hi..hi <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/oopclass2008.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/oopclass2008.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/oopclass2008.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/oopclass2008.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/oopclass2008.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/oopclass2008.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/oopclass2008.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/oopclass2008.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/oopclass2008.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/oopclass2008.wordpress.com/215/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oopclass2008.wordpress.com&blog=4788351&post=215&subd=oopclass2008&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://oopclass2008.wordpress.com/2008/12/09/singleton-pattern-print-spooler/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86374896a940a7345a76fe3d26824889?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">oopclass2008</media:title>
		</media:content>

		<media:content url="http://oopclass2008.files.wordpress.com/2008/12/picture-16.png" medium="image">
			<media:title type="html">picture-16</media:title>
		</media:content>
	</item>
		<item>
		<title>Singleton Pattern in Action</title>
		<link>http://oopclass2008.wordpress.com/2008/12/09/singleton-pattern-in-action/</link>
		<comments>http://oopclass2008.wordpress.com/2008/12/09/singleton-pattern-in-action/#comments</comments>
		<pubDate>Tue, 09 Dec 2008 16:13:35 +0000</pubDate>
		<dc:creator>oopclass2008</dc:creator>
				<category><![CDATA[Kuliah]]></category>

		<guid isPermaLink="false">http://oopclass2008.wordpress.com/?p=205</guid>
		<description><![CDATA[Kita sudah melihat kelas Singleton pada postingan sebelumnya. Tapi, kelas Singleton tersebut masih berupa template. Kita belum melihat bagaimana konsep Singleton digunakan untuk sesuatu yang bermanfaat. 
Dalam prakteknya, Singleton pattern digunakan ketika kita membutuhkan hanya satu objek, tidak boleh lebih. Sebagai contoh, print spooler. Di dalam suatu sistem komputer, kita harus memastikan hanya ada satu [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oopclass2008.wordpress.com&blog=4788351&post=205&subd=oopclass2008&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Kita sudah melihat kelas Singleton pada postingan sebelumnya. Tapi, kelas Singleton tersebut masih berupa <em>template</em>. Kita belum melihat bagaimana konsep Singleton digunakan untuk sesuatu yang bermanfaat. </p>
<p>Dalam prakteknya, Singleton pattern digunakan ketika kita membutuhkan<strong> hanya satu objek, tidak boleh lebih</strong>. Sebagai contoh, <strong>print spooler</strong>. Di dalam suatu sistem komputer, kita harus memastikan hanya ada satu <em>print spooler</em>. Bila lebih dari satu, dapat menyebabkan printer tidak bekerja dengan baik. Bisa-bisa, dokumen yang berbeda dari <em>print spooler</em> yang berbeda tercetak pada halaman yang sama. Kita bisa saja mempunyai lebih dari satu printer, tetapi <em>print spooler</em> tetap satu.</p>
<p>Contoh yang lain adalah <strong>registry</strong>. Bila terdapat lebih dari satu registry, bisa menyebabkan ketidakkonsistenan data-data di registry. Dan kalau tidak konsisten, system bisa <em>crash</em>. Contoh yang lain lagi adalah <strong>kotak dialog Find</strong> pada microsoft word. Ketika kita mengetikkan shortcut <em>ctrl+f,</em> muncul dialog Find. Kita ketikkan <em>ctrl+f</em> lagi, ternyata dialog Find tidak bertambah. Masih terdapat satu dialog Find di word. Kita tidak bisa lagi membuat instance dari frame dialog Find. Singleton pattern digunakan di sini. Dan.., masih banyak lagi contoh lainnya.</p>
<p>&#8230; Sekarang, andaikan kita mempunyai program untuk me-maintain buku alamat. Tetapi kita mempunyai masalah. Program tersebut berjalan terlalu lambat. Di dalam program kita ada <strong>objek BukuAlamat</strong>. Karena menampung jumlah data yang amat banyak, objek BukuAlamat tersebut berukuran cukup besar. Performa program kurang bagus karena kita terlalu banyak menginstance-kan objek BukuAlamat di dalam kode program sehingga membutuhkan memori yang besar.</p>
<p>Kali ini, kita coba memecahkan masalah performa dengan menerapkan <em>policy</em> BukuAlamat hanya boleh di-instance sekali sehingga hanya terdapat satu buku alamat aktif saja. Dengan kata lain, kita menerapkan <strong>Singleton Pattern</strong>. Bila kita ingin membuat buku alamat yang lain, instance BukuAlamat harus di-null-kan terlebih dahulu. Ada kalanya kita lupa dengan <em>policy</em> ini, dengan membuat instance baru BukuAlamat meskipun sudah ada instance sebelumnya. Kalau begini, Singleton pattern akan mencegahnya.</p>
<p>Sekarang, kita coba <em>wrap</em> BukuAlamat dengan <em>template</em> kelas Singleton yang telah kita buat sebelumnya. Kira-kira akan menjadi begini (<strong>BukuAlamat.java</strong>):</p>
<pre class="brush: java;">import java.util.*;

public class BukuAlamat {
	//instance Singleton
	private static BukuAlamat myInstance;

	//atribut buku alamat
	private ArrayList&lt;String&gt; buku;
	private String namaBukuAlamat;
	private int jumlahEntry;

	// private constructor
	private BukuAlamat(String nama) {
		buku = new ArrayList&lt;String&gt;();
		namaBukuAlamat = nama;
		jumlahEntry = 0;
	}

	public static BukuAlamat getInstance(String nama) {

		if (myInstance == null) {
			myInstance = new BukuAlamat(nama);
		}
		return myInstance;
	}

	public String getNamaBukuAlamat() {
		return namaBukuAlamat;
	}

	// Method buku alamat
	public void addEntry(String entry) {
		if (entry != null) {
			buku.add(entry);
			jumlahEntry++;
		}
	}

}
</pre>
<p>Kelas testernya seperti ini (<strong>SingletonTester.java</strong>):</p>
<pre class="brush: java;">public class SingletonTester {

	public static void main(String args[]) { 

		BukuAlamat bukuAlamat = BukuAlamat.getInstance(&quot;Teman SD&quot;); 

		System.out.println(&quot;Buku Alamat:  &quot; + bukuAlamat.getNamaBukuAlamat()); 

		// Buat instance baru BukuAlamat
		BukuAlamat bukuAlamatBaru = BukuAlamat.getInstance(&quot;Teman SMP&quot;); 

		System.out.println(&quot;Buku Alamat: &quot; + bukuAlamatBaru.getNamaBukuAlamat()); 

	}
}
</pre>
<p>Kita lihat apakah kelas kita ini mempan menerapkan Singleton pattern&#8230;<br />
<img src="http://oopclass2008.files.wordpress.com/2008/12/picture-151.png?w=500&#038;h=121" alt="picture-151" title="picture-151" width="500" height="121" class="alignnone size-full wp-image-209" /></p>
<p>Dilihat dari output di atas, ternyata kita tidak bisa membuat instance baru dari BukuAlamat. Kita ingin membuat BukuAlamat &#8220;<strong>Teman SMP</strong>&#8220;, tetapi karena sudah ada BukuAlamat &#8220;<strong>Teman SD</strong>&#8220;, kita gagal membuatnya.<br />
Ok, kali ini kita mendapatkan hasil seperti yang kita inginkan. Jadi, Singleton pattern bekerja. </p>
<p><em>And one more thing</em>, ilustrasi ini merupakan salah satu contoh bagaimana Singleton pattern digunakan untuk mencegah penggunaan <em>system resources</em> yang terlalu besar. </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/oopclass2008.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/oopclass2008.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/oopclass2008.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/oopclass2008.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/oopclass2008.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/oopclass2008.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/oopclass2008.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/oopclass2008.wordpress.com/205/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/oopclass2008.wordpress.com/205/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/oopclass2008.wordpress.com/205/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oopclass2008.wordpress.com&blog=4788351&post=205&subd=oopclass2008&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://oopclass2008.wordpress.com/2008/12/09/singleton-pattern-in-action/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86374896a940a7345a76fe3d26824889?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">oopclass2008</media:title>
		</media:content>

		<media:content url="http://oopclass2008.files.wordpress.com/2008/12/picture-151.png" medium="image">
			<media:title type="html">picture-151</media:title>
		</media:content>
	</item>
		<item>
		<title>Singleton Pattern</title>
		<link>http://oopclass2008.wordpress.com/2008/12/07/singleton-pattern/</link>
		<comments>http://oopclass2008.wordpress.com/2008/12/07/singleton-pattern/#comments</comments>
		<pubDate>Sun, 07 Dec 2008 17:01:58 +0000</pubDate>
		<dc:creator>oopclass2008</dc:creator>
				<category><![CDATA[Kuliah]]></category>

		<guid isPermaLink="false">http://oopclass2008.wordpress.com/?p=197</guid>
		<description><![CDATA[Welcome back, pattern kita selanjutnya adalah Singleton Pattern. Pattern ini merupakan pattern yang paling sederhana di antara pattern-pattern yang lain. Hanya membutuhkan satu kelas pada class diagram. Ok, langsung saja. Ini definisi dari Singleton Pattern:
Singleton Pattern memastikan suatu kelas hanya terdapat satu instance dan kelas tersebut menyediakan akses ke instance itu.
Hah? Hanya satu instance? Satu [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oopclass2008.wordpress.com&blog=4788351&post=197&subd=oopclass2008&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong><em>Welcome back</em></strong>, pattern kita selanjutnya adalah <strong>Singleton Pattern</strong>. Pattern ini merupakan pattern yang paling sederhana di antara pattern-pattern yang lain. Hanya membutuhkan satu kelas pada <em>class diagram</em>. Ok, langsung saja. Ini definisi dari Singleton Pattern:</p>
<blockquote><p>Singleton Pattern memastikan suatu kelas hanya terdapat satu instance dan kelas tersebut menyediakan akses ke instance itu.</p></blockquote>
<p><strong>Hah? Hanya satu instance? Satu objek? Kita capek-capek membuat kelas, hanya bisa di-instance sekali?</strong></p>
<p>Yap. Ada banyak situasi dimana kita hanya membutuhkan satu objek. Misalnya, objek yang berfungsi sebagai driver dari suatu device seperti printer. Apa jadinya bila lebih dari satu? Pernah lihat pesan yang menampilkan drivers conflict. <em>Yeah, sort of it</em>.</p>
<p>Faktanya, banyak lagi tipe objek yang jika di-instance-kan lebih dari satu menyebabkan terjadinya masalah seperti penggunaan resource yang tidak normal, behavior program yang tidak benar, dan hasil yang tidak konsisten.</p>
<p>Sekarang, kita lihat saja kelas Singleton berikut:</p>
<pre class="brush: java;">public class Singleton {
	private static Singleton myInstance;

	// atribut yang lain

	private Singleton() {	

	}

	public static Singleton getInstance() {
		if (myInstance == null) {
			myInstance = new Singleton();
		}
		return myInstance;
	}

	// method yang lain
}
</pre>
<p><strong>Sekarang, pertanyaannya, apa artinya kode di atas? Kenapa kode tersebut bisa memunculkan efek Singleton?</strong></p>
<p>Kita coba uraikan kode di atas. Dimulai dengan <strong>constructor</strong> berikut:</p>
<pre class="brush: java;">
private Singleton() {

}
</pre>
<p><strong>Hmmm&#8230;private constructor?</strong> Di Java, kita buat objek baru minimal dengan menuliskan statement new SomeObject(). Nah, tanda kurung di belakang SomeObject menyatakan: <strong>sebelum membuat objek baru, kita panggil constructor-nya</strong>.</p>
<p>Tapi&#8230;, bagaimana kalau kelas kita tidak punya constructor? <em>See, I don&#8217;t have a constructor, so I don&#8217;t need to invoke constructor</em>. Meskipun kelas kita tidak mempunyai constructor, JVM menambahkan default-nya untuk kita:</p>
<pre class="brush: java;">
public SomeObject() {

}
</pre>
<p>Jadi, kelas kita pasti ada constructor-nya, biarpun kita tidak menuliskannya secara eksplisit. </p>
<p><strong>Sekarang, apa artinya modifier private pada constructor?</strong> Yap, memang tidak seperti constructor kebanyakan yang menggunakan public. Private di sini berarti hanya kode yang sekelas dengan constructor yang dapat mengakses constructor ini. Tidak ada yang bisa mengaksesnya di luar kelas. Dengan kata lain, tidak ada yang bisa mengeksekusi statement<strong> &#8220;new&#8221;</strong> di luar kelas, karena kita tidak bisa mengakses constructor-nya.</p>
<p>Jadi, kelas Singleton di atas tidak bisa di-instance-kan?</p>
<p>Nope, bisa, asal di-instance-kan di dalam kelas Singleton.</p>
<p>Sekarang, kita telusuri lagi kelas Singleton, dan menemukan <em>snippet</em> kode seperti ini:</p>
<pre class="brush: java;">
public static Singleton getInstance() {
		if (myInstance == null) {
			myInstance = new Singleton();
		}
		return myInstance;
	}
</pre>
<p>Method <strong>getInstance()</strong> di atas bertipe static. Dengan bertipe static menjadikan method tersebut hanya terdapat satu saja di antara instance-instance. Karena static method hidup di kelas, dan bukan di instance-instance. Berbeda dengan constructor yang private, method ini bersifat public sehingga bisa dipanggil di luar kelas Singleton. Dan karena bertipe static, method tersebut kita panggil dengan mengkualifikasikan nama kelas dan nama method seperti ini:</p>
<pre class="brush: java;">Singleton.getInstance()</pre>
<p>Method getInstance() menyediakan cara bagi kita untuk meng-instance-kan kelas Singleton dan mengembalikan instance tersebut. </p>
<p>Jika myInstance null, artinya kita belum membuat instance. Kemudian, kita meng-instance-kan Singleton melalui private constructor-nya dan meng-assign instance ini ke myInstance. Ini bisa dilakukan karena kita meng-instance-kan di dalam kelas Singleton. Atribut myInstance ini bertipe static juga, karena instance kita merupakan satu-satunya instance kelas Singleton. </p>
<p>Jika myInstance tidak null, artinya kita sudah mempunyai instance, dan instance tersebut yang akan dikembalikan ke kita.</p>
<p><strong>Jadi, kita masih bisa membuat instance dari kelas Singleton. Tapi, hanya satu. Tidak lebih!</strong> Karena itulah yang kita harapkan dari Singleton pattern ini.</p>
<p>Cool&#8230; </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/oopclass2008.wordpress.com/197/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/oopclass2008.wordpress.com/197/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/oopclass2008.wordpress.com/197/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/oopclass2008.wordpress.com/197/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/oopclass2008.wordpress.com/197/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/oopclass2008.wordpress.com/197/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/oopclass2008.wordpress.com/197/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/oopclass2008.wordpress.com/197/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/oopclass2008.wordpress.com/197/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/oopclass2008.wordpress.com/197/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oopclass2008.wordpress.com&blog=4788351&post=197&subd=oopclass2008&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://oopclass2008.wordpress.com/2008/12/07/singleton-pattern/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86374896a940a7345a76fe3d26824889?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">oopclass2008</media:title>
		</media:content>
	</item>
		<item>
		<title>Design Pattern Sebagai Shared Vocabulary</title>
		<link>http://oopclass2008.wordpress.com/2008/12/06/design-pattern-sebagai-shared-vocabulary/</link>
		<comments>http://oopclass2008.wordpress.com/2008/12/06/design-pattern-sebagai-shared-vocabulary/#comments</comments>
		<pubDate>Sat, 06 Dec 2008 16:18:37 +0000</pubDate>
		<dc:creator>oopclass2008</dc:creator>
				<category><![CDATA[Kuliah]]></category>

		<guid isPermaLink="false">http://oopclass2008.wordpress.com/?p=189</guid>
		<description><![CDATA[Sebelum membahas pattern yang lain, saya ingin mem-post-kan dulu, sebenarnya apa sih yang dimaksud dengan design pattern? Saya memperoleh penjelasan yang bagus di buku Head First Design Pattern.
Cerita tentang design pattern dimulai dari kutipan percakapan berikut.
Di sebuah restoran fast-food:
Anto:  Aku mau pesan 2 ayam, 1 nasi putih, 1 french fries, 1 coca-cola. Terus pesan [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oopclass2008.wordpress.com&blog=4788351&post=189&subd=oopclass2008&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Sebelum membahas pattern yang lain, saya ingin mem-post-kan dulu, <strong>sebenarnya apa sih yang dimaksud dengan design pattern?</strong> Saya memperoleh penjelasan yang bagus di buku <strong>Head First Design Pattern</strong>.</p>
<p>Cerita tentang design pattern dimulai dari kutipan percakapan berikut.<br />
Di sebuah restoran fast-food:</p>
<blockquote><p>Anto:  Aku mau pesan 2 ayam, 1 nasi putih, 1 french fries, 1 coca-cola. Terus pesan 1 burger, 1 french fries, 1 coca-cola. Pesan juga spaghetti, 1 french fries, 1 coca-cola. Aku juga pesan 1 coca-cola yang diberi es krim di atasnya.</p></blockquote>
<blockquote><p>Joni (customer di samping Anto): 1 paket A, 1 paket B, 1 paket C, dan 1 cokefloat.</p></blockquote>
<p>Kedua pesanan tersebut sama. Namun, Anto membutuhkan kata-kata yang lebih banyak daripada Joni untuk menyampaikan pesanannya. Dan lagi, penerima order harus mengingat lebih banyak.</p>
<p><strong>Kenapa bisa begini?</strong> Joni dan penerima order memiliki kosakata dari pesanan-pesanan yang ada di restoran tersebut. Mereka sama-sama sudah mempunyai <strong>shared vocabulary</strong>. Hal ini membuat komunikasi menjadi lebih lancar. Penerima order tidak perlu banyak mengingat karena sudah mempunyai <strong>pattern pesanan</strong> di kepalanya.</p>
<p><strong>Hubungannya dengan design pattern?</strong> Analogi di atas juga berlaku pada design pattern. Design pattern memberikan kita <strong>shared vocabulary</strong> dengan developer lain. Dengan memiliki vocabulary ini, kita lebih mudah berkomunikasi dan juga menginspirasi bagi yang belum tahu untuk mempelajarinya. Kita bisa berpikir tentang arsitektur di tingkatan pattern, dan bukan di tingkatan objek yang terlalu detil.</p>
<p><strong>So, bagaimana kita menggunakan design pattern?</strong> Kita sudah biasa menggunakan library dan framework, <em>right?!</em> Kita biasa menulis kode dengan menggunakan API dan mengikutsertakannya di program kita. Ambil contoh, Java API memberikan segala fungsionalitas dari GUI, IO, sampai network. Kita bisa memilih komponen-komponen dan memasukkannya ke aplikasi kita. Tetapi, semuanya tidak membantu menstrukturkan aplikasi kita supaya lebih mudah dibaca, lebih mudah di-maintain, dan lebih fleksibel.</p>
<p>&#8230;.Oleh karena itu, design pattern ada. Design pattern tidak langsung muncul di kode, tetapi ada di otak kita terlebih dahulu. Setelah otak kita ter-load oleh pengetahuan tentang pattern, kita dapat mengaplikasikannya di desain baru atau merevisi kode menjadi kode yang fleksibel.</p>
<p><strong>So, design patterns are so great. Cool!</strong> <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<blockquote><p>Anto: Gw udah bikin kelas broadcast. Kelas ini mendaftar semua objek-objek yang mendengarkannya. Tiap kali ada data baru, kelas ini akan ngirimin pesan ke masing-masing listener. Nah, bagian yang paling keren noh, listener bisa join ke broadcast setiap saat dan juga bisa out dengan sendirinya. Keren kan. Sistem ini dinamik banget dan loosely-coupled.</p></blockquote>
<blockquote><p>Joni: Tok, kenapa Lu nggak bilang aja, Lu gunain <strong>Observer Pattern</strong>?!!!!!</p></blockquote>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/oopclass2008.wordpress.com/189/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/oopclass2008.wordpress.com/189/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/oopclass2008.wordpress.com/189/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/oopclass2008.wordpress.com/189/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/oopclass2008.wordpress.com/189/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/oopclass2008.wordpress.com/189/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/oopclass2008.wordpress.com/189/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/oopclass2008.wordpress.com/189/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/oopclass2008.wordpress.com/189/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/oopclass2008.wordpress.com/189/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oopclass2008.wordpress.com&blog=4788351&post=189&subd=oopclass2008&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://oopclass2008.wordpress.com/2008/12/06/design-pattern-sebagai-shared-vocabulary/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86374896a940a7345a76fe3d26824889?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">oopclass2008</media:title>
		</media:content>
	</item>
		<item>
		<title>Printing di Java</title>
		<link>http://oopclass2008.wordpress.com/2008/12/06/printing-di-java/</link>
		<comments>http://oopclass2008.wordpress.com/2008/12/06/printing-di-java/#comments</comments>
		<pubDate>Sat, 06 Dec 2008 10:21:01 +0000</pubDate>
		<dc:creator>oopclass2008</dc:creator>
				<category><![CDATA[Kuliah]]></category>

		<guid isPermaLink="false">http://oopclass2008.wordpress.com/?p=179</guid>
		<description><![CDATA[Postingan ini membahas salah satu cara bagaimana melakukan printing di Java. Ok, seperti biasa, kita buat contoh spesifiknya. 
Setelah melakukan sorting entry alamat, kita ingin melakukan hal yang lebih keren lagi. What&#8217;s that? Mencetak entry alamat. Jadi, dari kumpulan entry alamat yang kita punyai, kita ingin mencetaknya ke dalam label alamat. Cool?! Really Cool?! he..he..he
Sekarang, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oopclass2008.wordpress.com&blog=4788351&post=179&subd=oopclass2008&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Postingan ini membahas <strong>salah satu cara</strong> bagaimana melakukan <strong>printing di Java</strong>. Ok, seperti biasa, kita buat contoh spesifiknya. </p>
<p>Setelah melakukan sorting entry alamat, kita ingin melakukan hal yang lebih keren lagi. <em>What&#8217;s that?</em> <strong>Mencetak entry alamat</strong>. Jadi, dari kumpulan entry alamat yang kita punyai, kita ingin mencetaknya ke dalam label alamat. <em>Cool?! Really Cool?!</em> he..he..he</p>
<p><strong>Sekarang, bagaimana kita melakukannya? Darimana kita memulainya?</strong> Oh, tentu saja dari javadocs. Kita cari-cari java printing. Akhirnya kita menemukannya. Tapi&#8230; duh, kita baca jadi pusing. Akhirnya kita memutuskan mencari info lewat mesin pencarian kesayangan kita, Google. Kita ketikkan keyword <strong>java printing</strong>. Akhirnya kita terdampar di site ini:<br />
<a href="http://java.sun.com/docs/books/tutorial/2d/printing/index.html">http://java.sun.com/docs/books/tutorial/2d/printing/index.html</a></p>
<p>Halah, ternyata di situs java-nya sendiri terdapat tutorial bagaimana menggunakan java printing. Di sana terdapat beberapa contoh yang bisa kita pakai untuk keperluan kita. Tapi ada satu contoh yang tampaknya cocok dengan masalah kita, yaitu <strong>PaginationExample.java</strong>. Di contoh tersebut, didemonstrasikan bagaimana mencetak array dari Strings. Wah, ini bisa dipakai. Tapi kita perlu memodifikasinya. Alih-alih mem-feed-kan array dari string &#8220;This is line &#8230;&#8221;, kita feed-kan dengan string dari kita, yaitu info entry alamat. <strong>Done&#8230;</strong></p>
<p><strong>Sekarang, kodenya bagaimana?</strong><br />
Kita modifikasi kelas entry alamat kita dengan mengubah reprentasi string dari entry alamat. Ini untuk keperluan tampilan di label. <em>Ok, that&#8217;s easy</em>&#8230;</p>
<pre class="brush: java;">import java.util.*;

public class EntryAlamat implements Comparable&lt;EntryAlamat&gt; {

	private String nama;
	private String alamat;

	public EntryAlamat(String nama, String alamat) {
		this.nama = nama;
		this.alamat = alamat;
	}

	public String getNama() {
		return nama;
	}

	public String getAlamat() {
		return alamat;
	}

	public int compareTo(EntryAlamat lain) {
		return nama.compareTo(lain.getNama());
	}

	public String toString() {
		StringBuffer buffer = new StringBuffer();
		buffer.append(&quot;=================================\n&quot;);
		buffer.append(nama);
		buffer.append('\n');
		buffer.append(alamat);
		buffer.append(&quot;\n=================================\n&quot;);
		return buffer.toString();
	}
}
</pre>
<p>Selanjutnya, kita modifikasi PaginationExample.java menjadi seperti listing kode di bawah. Kita ubah namanya menjadi <strong>PrintingAlamat.java</strong>. Kemudian, kita isi <strong>initTextLines</strong> dengan array string milik kita. <em>Ok, that&#8217;s also easy</em>&#8230;</p>
<pre class="brush: java;">/*
 * Copyright (c) 1995 - 2008 Sun Microsystems, Inc.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Sun Microsystems nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS &quot;AS
 * IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */ 

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.print.*;
import java.util.*;

public class PrintingAlamat implements Printable, ActionListener {

    int[] pageBreaks;  // array of page break line positions.

    String[] textLines;  

    private void initTextLines() {

    	ArrayList&lt;EntryAlamat&gt; BukuAlamat = new ArrayList&lt;EntryAlamat&gt;();

		// Sampel
		BukuAlamat.add(new EntryAlamat(&quot;Yayak&quot;, &quot;Gedongkuning no. 419 Yogyakarta&quot;));
		BukuAlamat.add(new EntryAlamat(&quot;Paijo&quot;, &quot;Babadan RT. 1 RW. 1 Banguntapan Bantul&quot;));
		BukuAlamat.add(new EntryAlamat(&quot;Andi&quot;, &quot;Janti no. 1 Yogyakarta&quot;));
		BukuAlamat.add(new EntryAlamat(&quot;Budi&quot;, &quot;Tegalrejo RT. 16 RW. 16 Banguntapan Bantul&quot;));
    	StringBuffer buffer = new StringBuffer();
    	for (EntryAlamat entry: BukuAlamat) {
    	        buffer.append(entry);
    	        buffer.append('\n');
    	}
		textLines = buffer.toString().split(&quot;\n&quot;);
    }

    /* Synthesise some sample lines of text */
    //private void initTextLines() {
    //    if (textLines == null) {
    //        int numLines=200;
    //        textLines = new String[numLines];
    //        for (int i=0;i&lt;numLines;i++) {
    //            textLines[i]= &quot;This is line number &quot; + i;
    //        }
    //    }
    //}

    public int print(Graphics g, PageFormat pf, int pageIndex)
             throws PrinterException {

        Font font = new Font(&quot;Serif&quot;, Font.PLAIN, 10);
        FontMetrics metrics = g.getFontMetrics(font);
        int lineHeight = metrics.getHeight();

        if (pageBreaks == null) {
            initTextLines();
            int linesPerPage = (int)(pf.getImageableHeight()/lineHeight);
            int numBreaks = (textLines.length-1)/linesPerPage;
            pageBreaks = new int[numBreaks];
            for (int b=0; b&lt;numBreaks; b++) {
                pageBreaks[b] = (b+1)*linesPerPage;
            }
        }

        if (pageIndex &gt; pageBreaks.length) {
            return NO_SUCH_PAGE;
        }

        /* User (0,0) is typically outside the imageable area, so we must
         * translate by the X and Y values in the PageFormat to avoid clipping
         * Since we are drawing text we
         */
        Graphics2D g2d = (Graphics2D)g;
        g2d.translate(pf.getImageableX(), pf.getImageableY());

        /* Draw each line that is on this page.
         * Increment 'y' position by lineHeight for each line.
         */
        int y = 0;
        int start = (pageIndex == 0) ? 0 : pageBreaks[pageIndex-1];
        int end   = (pageIndex == pageBreaks.length)
                         ? textLines.length : pageBreaks[pageIndex];
        for (int line=start; line&lt;end; line++) {
            y += lineHeight;
            g.drawString(textLines[line], 0, y);
        }

        /* tell the caller that this page is part of the printed document */
        return PAGE_EXISTS;
    }

    public void actionPerformed(ActionEvent e) {
         PrinterJob job = PrinterJob.getPrinterJob();
         job.setPrintable(this);
         boolean ok = job.printDialog();
         if (ok) {
             try {
                  job.print();
             } catch (PrinterException ex) {
              /* The job did not successfully complete */
             }
         }
    }

    public static void main(String args[]) {

        try {
            String cn = UIManager.getSystemLookAndFeelClassName();
            UIManager.setLookAndFeel(cn); // Use the native L&amp;F
        } catch (Exception cnf) {
        }
        JFrame f = new JFrame(&quot;Printing Entry Alamat&quot;);
        f.addWindowListener(new WindowAdapter() {
           public void windowClosing(WindowEvent e) {System.exit(0);}
        });
        JButton printButton = new JButton(&quot;Print Pages&quot;);
        printButton.addActionListener(new PrintingAlamat());
        f.add(&quot;Center&quot;, printButton);
        f.pack();
        f.setVisible(true);
    }
}
</pre>
<p><strong>Ok, now hope and pray.</strong><br />
<img src="http://oopclass2008.files.wordpress.com/2008/12/picture-11.png?w=500&#038;h=164" alt="picture-11" title="picture-11" width="500" height="164" class="alignnone size-full wp-image-180" /></p>
<p>Yess, akhirnya tampilan printer dialog muncul. Ini pertanda bagus.<br />
<img src="http://oopclass2008.files.wordpress.com/2008/12/picture-12.png?w=500&#038;h=393" alt="picture-12" title="picture-12" width="500" height="393" class="alignnone size-full wp-image-181" /></p>
<p>Dan, hasilnya seperti ini.<br />
<img src="http://oopclass2008.files.wordpress.com/2008/12/picture-13.png?w=500&#038;h=305" alt="picture-13" title="picture-13" width="500" height="305" class="alignnone size-full wp-image-182" /></p>
<p><strong>How&#8217;s that? Cool?</strong> <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/oopclass2008.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/oopclass2008.wordpress.com/179/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/oopclass2008.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/oopclass2008.wordpress.com/179/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/oopclass2008.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/oopclass2008.wordpress.com/179/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/oopclass2008.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/oopclass2008.wordpress.com/179/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/oopclass2008.wordpress.com/179/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/oopclass2008.wordpress.com/179/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oopclass2008.wordpress.com&blog=4788351&post=179&subd=oopclass2008&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://oopclass2008.wordpress.com/2008/12/06/printing-di-java/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86374896a940a7345a76fe3d26824889?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">oopclass2008</media:title>
		</media:content>

		<media:content url="http://oopclass2008.files.wordpress.com/2008/12/picture-11.png" medium="image">
			<media:title type="html">picture-11</media:title>
		</media:content>

		<media:content url="http://oopclass2008.files.wordpress.com/2008/12/picture-12.png" medium="image">
			<media:title type="html">picture-12</media:title>
		</media:content>

		<media:content url="http://oopclass2008.files.wordpress.com/2008/12/picture-13.png" medium="image">
			<media:title type="html">picture-13</media:title>
		</media:content>
	</item>
		<item>
		<title>Sorting (Bagian 2)</title>
		<link>http://oopclass2008.wordpress.com/2008/12/06/sorting-bagian-2/</link>
		<comments>http://oopclass2008.wordpress.com/2008/12/06/sorting-bagian-2/#comments</comments>
		<pubDate>Sat, 06 Dec 2008 06:41:16 +0000</pubDate>
		<dc:creator>oopclass2008</dc:creator>
				<category><![CDATA[Kuliah]]></category>

		<guid isPermaLink="false">http://oopclass2008.wordpress.com/?p=164</guid>
		<description><![CDATA[Pada postingan Sorting Bagian 1, kita sudah lihat bagaimana men-sort entry alamat berdasarkan nama. Waktu itu, kita gunakan kelas EntryAlamat yang mengimplementasikan interface Comparable, kemudian meng-override method compareTo(). Kali ini, kita tidak hanya men-sort berdasarkan nama, tetapi juga berdasarkan alamat. Tetapi ada sedikit problem. Kita sudah menggunakan method compareTo() untuk men-sort berdasarkan nama sehingga kita [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oopclass2008.wordpress.com&blog=4788351&post=164&subd=oopclass2008&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Pada postingan <strong>Sorting Bagian 1,</strong> kita sudah lihat bagaimana men-sort entry alamat berdasarkan nama. Waktu itu, kita gunakan kelas EntryAlamat yang mengimplementasikan interface <strong>Comparable</strong>, kemudian meng-override method <strong>compareTo()</strong>. Kali ini, kita tidak hanya men-sort berdasarkan nama, tetapi juga berdasarkan alamat. Tetapi ada sedikit problem. Kita sudah menggunakan method compareTo() untuk men-sort berdasarkan nama sehingga kita tidak bisa lagi menggunakan method compareTo() untuk men-sort berdasarkan alamat. </p>
<p><strong>So, bagaimana kita melakukannya?</strong> Oh gampang. Kita gunakan saja variable boolean pada kelas EntryAlamat, dan kemudian menggunakan pengetesan <strong>if-else</strong> pada method compareTo(). Selanjutnya, kita berikan <em>return value</em> yang berbeda, tergantung dari variable boolean yang di-set di kelas EntryAlamat.</p>
<p>Ya, ya, ya, itu bisa dilakukan. Tetapi solusi tersebut rasanya kurang elegan dan tidak terlalu OO <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  Kita akan menggunakan cara lain untuk kasus ini.</p>
<p><strong>Sekarang, darimana kita mulai?</strong> Ya, di mana lagi selain lihat <strong>java docs</strong>. Kita lihat dokumentasi kelas Collections API lagi. Kita menemukan ini.<br />
<img src="http://oopclass2008.files.wordpress.com/2008/12/picture-7.png?w=500&#038;h=48" alt="picture-7" title="picture-7" width="500" height="48" class="alignnone size-full wp-image-161" /></p>
<p>Ternyata, terdapat method sort yang kedua. Method ini membutuhkan dua argumen, satu berupa list, dan satu lagi berupa <strong>Comparator</strong>. <em>What? Again?</em> Yep, kita harus melihat apa itu Comparator. Kita lihat javadocs dan menemukan ini.<br />
<img src="http://oopclass2008.files.wordpress.com/2008/12/picture-8.png?w=500&#038;h=121" alt="picture-8" title="picture-8" width="500" height="121" class="alignnone size-full wp-image-162" /></p>
<p>Ternyata Comparator juga berupa interface, sama seperti Comparable. Tetapi ada bedanya. Suatu elemen pada list dapat membandingkan dirinya dengan elemen yang lain dengan menggunakan method compareTo() pada interface Comparable. Sedangkan, Comparator merupakan kelas terpisah dan di luar dari tipe-tipe element yang kita bandingkan. Ia semacam <strong>custom comparator</strong>. Artinya, kita dapat mempunyai comparator sebanyak yang kita mau. Ingin men-sort berdasarkan alamat, gunakan <strong>AlamatComparator</strong>. Ingin men-sort berdasarkan umur, gunakan <strong>UmurComparator</strong>. Ingin men-sort berdasarkan nomor Telepon, gunakan <strong>NoTeleponComparator</strong>. <em>Anyway, you get the idea</em>.</p>
<p>Kemudian, yang perlu kita lakukan adalah memanggil method sort yang kedua tadi dan mem-pass-kan list kita serta Comparator. Comparator akan membantu method Sort mengurutkan elemen-elemen pada list.</p>
<p><strong>Sekarang, bagaimana kita menulis Comparator kita</strong>. Ingat, selain berdasarkan nama, kita ingin men-sort berdasarkan alamat. Jadi kita perlu menulis kelas AlamatComparator. <em>How we do it?</em></p>
<p>Ok, pertama, kita menulis suatu inner class yang mengimplementasikan Comparator, sebut saja inner class-nya <strong>AlamatComparator</strong>. Di inner class AlamatComparator, kita override method compare(). Di method <strong>compare()</strong>, kita lakukan sama seperti ketika kita menulis method compareTo(). Hanya diperlukan sedikit modifikasi. Kita akan lihat listing kodenya sebentar lagi. Selanjutnya, kita buat instance dari inner class AlamatComparator, dan kita pass-kan ke method sort yang kedua (Atau istilahnya overloaded method sort(), method sort yang sama tetapi beda argumennya). </p>
<p>Ini dia listing lengkapnya.</p>
<pre class="brush: java;">import java.util.*;

public class EntryAlamat implements Comparable&lt;EntryAlamat&gt; {

	private String nama;
	private String alamat;

	public EntryAlamat(String nama, String alamat) {
		this.nama = nama;
		this.alamat = alamat;
	}

	public String getNama() {
		return nama;
	}

	public String getAlamat() {
		return alamat;
	}

	public int compareTo(EntryAlamat lain) {
		return nama.compareTo(lain.getNama());
	}

	public String toString() {
		return &quot;[&quot;+ nama + &quot;, &quot; + alamat + &quot;]&quot;;
	}
}
</pre>
<pre class="brush: java;">import java.util.*;

public class SortingEntryAlamat {

       public static void main(String[] args) {
	       new SortingEntryAlamat().test();
       }

       public void test() {
	       ArrayList&lt;EntryAlamat&gt; listAlamat = new ArrayList&lt;EntryAlamat&gt;();       

	       // Sampel
	       listAlamat.add(new EntryAlamat(&quot;Yayak&quot;, &quot;Gedongkuning&quot;));
	       listAlamat.add(new EntryAlamat(&quot;Paijo&quot;, &quot;Babadan&quot;));
	       listAlamat.add(new EntryAlamat(&quot;Andi&quot;, &quot;Janti&quot;));
	       listAlamat.add(new EntryAlamat(&quot;Budi&quot;, &quot;Tegalrejo&quot;));

	       System.out.println(&quot;Sebelum di-sort:&quot;);
	       System.out.println(listAlamat);

	       // Sort entry berdasarkan nama
	       Collections.sort(listAlamat);
	       System.out.println(&quot;\nSetelah di-sort berdasarkan nama:&quot;);
	       System.out.println(listAlamat);

	       // Sort entry berdasarkan alamat
	       Collections.sort(listAlamat, new AlamatComparator());
	       System.out.println(&quot;\nSetelah di-sort berdasarkan alamat:&quot;);
	       System.out.println(listAlamat);
       }

       // inner class yang mengimplementasikan Comparator
       class AlamatComparator implements Comparator&lt;EntryAlamat&gt; {
	       public int compare(EntryAlamat a, EntryAlamat b) {
		       return a.getAlamat().compareTo(b.getAlamat());
	       }
       }

}
</pre>
<p>Dan outputnya:<br />
<img src="http://oopclass2008.files.wordpress.com/2008/12/picture-10.png?w=500&#038;h=177" alt="picture-10" title="picture-10" width="500" height="177" class="alignnone size-full wp-image-168" /></p>
<p><strong>What do you think? Cool? </strong>he..he..he..</p>
<p><em>Oh yeah, one more thing</em>. Untuk keterangan lebih lanjut, baca saja <strong>Head First Java</strong>.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/oopclass2008.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/oopclass2008.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/oopclass2008.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/oopclass2008.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/oopclass2008.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/oopclass2008.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/oopclass2008.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/oopclass2008.wordpress.com/164/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/oopclass2008.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/oopclass2008.wordpress.com/164/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oopclass2008.wordpress.com&blog=4788351&post=164&subd=oopclass2008&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://oopclass2008.wordpress.com/2008/12/06/sorting-bagian-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86374896a940a7345a76fe3d26824889?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">oopclass2008</media:title>
		</media:content>

		<media:content url="http://oopclass2008.files.wordpress.com/2008/12/picture-7.png" medium="image">
			<media:title type="html">picture-7</media:title>
		</media:content>

		<media:content url="http://oopclass2008.files.wordpress.com/2008/12/picture-8.png" medium="image">
			<media:title type="html">picture-8</media:title>
		</media:content>

		<media:content url="http://oopclass2008.files.wordpress.com/2008/12/picture-10.png" medium="image">
			<media:title type="html">picture-10</media:title>
		</media:content>
	</item>
		<item>
		<title>Sorting (Bagian 1)</title>
		<link>http://oopclass2008.wordpress.com/2008/12/05/sorting-bagian-1/</link>
		<comments>http://oopclass2008.wordpress.com/2008/12/05/sorting-bagian-1/#comments</comments>
		<pubDate>Fri, 05 Dec 2008 08:29:44 +0000</pubDate>
		<dc:creator>oopclass2008</dc:creator>
				<category><![CDATA[Kuliah]]></category>

		<guid isPermaLink="false">http://oopclass2008.wordpress.com/?p=147</guid>
		<description><![CDATA[Pada postingan kali ini, akan dibahas bagaimana melakukan sorting di java. Kita ingin men-sort suatu list yang distrukturkan dalam ArrayList. Kenapa ArrayList? Tidak ada alasan khusus sih. Kita bisa menggunakan struktur data yang lain, asal berupa list. Namun untuk contoh kita pakai saja ArrayList. 
Ok, begini saja. Kita mulai contoh spesifik-nya. Andaikan kita ingin men-sort [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oopclass2008.wordpress.com&blog=4788351&post=147&subd=oopclass2008&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Pada postingan kali ini, akan dibahas bagaimana melakukan sorting di java. Kita ingin men-sort suatu list yang distrukturkan dalam <strong>ArrayList</strong>. Kenapa ArrayList? Tidak ada alasan khusus sih. Kita bisa menggunakan struktur data yang lain, asal berupa list. Namun untuk contoh kita pakai saja ArrayList. </p>
<p><strong>Ok, begini saja</strong>. Kita mulai contoh spesifik-nya. Andaikan kita ingin men-sort list yang berupa entry alamat. Tiap entry alamat terdiri dari nama dan alamat. Kita ingin men-sort list entry alamat tersebut berdasarkan nama. <em>How is that? Cool? he..he..he (ok ,ok , not cool enough)</em></p>
<p><strong>Sekarang darimana kita mulai?</strong> Bagaimana kalau kita mulai menulis kelas entry alamat-nya? Deal? deal&#8230;.<br />
Ini dia kelas entry alamat-nya (<strong>EntryAlamat.java</strong>):</p>
<pre class="brush: java;">import java.util.*;

public class EntryAlamat implements Comparable&lt;EntryAlamat&gt; {

	private String nama;
	private String alamat;

	public EntryAlamat(String nama, String alamat) {
		this.nama = nama;
		this.alamat = alamat;
	}

	public String getNama() {
		return nama;
	}

	public String getAlamat() {
		return alamat;
	}

	public int compareTo(EntryAlamat lain) {
		return nama.compareTo(lain.getNama());
	}

	public String toString() {
		return &quot;[&quot;+ nama + &quot;, &quot; + alamat + &quot;]&quot;;
	}
}
</pre>
<p>Kenapa kita bisa menulis seperti itu? <em>Where the heck Comparable comes from? What is compareTo method?</em><br />
<em>Ok, you know what?</em> Anggap saja sudah dari sananya, hi..hi..hi..</p>
<p><em>Sorry just kidding</em>, ini penjelasan singkatnya. Mulanya kita ingin melakukan sorting, terus kita baca-baca di <strong>java docs</strong>, ada tidak method untuk sorting? <em>NDilalah</em>&#8230; kita menemukan dokumentasi yang ada di kelas Collections seperti ini:<br />
<img src="http://oopclass2008.files.wordpress.com/2008/12/picture-3.png?w=500&#038;h=42" alt="picture-3" title="picture-3" width="500" height="42" class="alignnone size-full wp-image-148" /></p>
<p>Ternyata, di kelas Collections terdapat method sort. Method sort tersebut mengambil argumen List. Karena ArrayList mengimplementasikan interface List, maka ArrayList berupa List. Jadi ArrayList bisa di-pass-kan ke method sort. Tapi, sebagai orang yang selalu ingin tahu, kita bertanya-tanya: bagaimana method sort melakukan sorting terhadap entry alamat kita. Entry Alamat kita kan berupa objek, dan kita ingin men-sort-nya berdasarkan nama.  </p>
<p>Kita scroll down lagi java docs-nya, dan melihat detil method sort. Hasilnya seperti ini.</p>
<p><img src="http://oopclass2008.files.wordpress.com/2008/12/picture-4.png?w=500&#038;h=141" alt="picture-4" title="picture-4" width="500" height="141" class="alignnone size-full wp-image-149" /></p>
<p>Aneh memang artinya. Berhubungan dengan generics bla&#8230;bla&#8230;bla (Bisa dibaca di <strong>Head First Java</strong> <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ). Tapi untuk short-cut-nya, EntryAlamat kita harus mengimplementasikan interface <strong>Comparable</strong> dan meng-override method <strong>compareTo</strong>. Ini dokumentasi pada interface Comparable pada java.lang:<br />
<img src="http://oopclass2008.files.wordpress.com/2008/12/picture-5.png?w=500&#038;h=135" alt="picture-5" title="picture-5" width="500" height="135" class="alignnone size-full wp-image-150" /></p>
<p>Jadi, method compareTo() akan dipanggil oleh salah satu objek EntryAlamat. Kemudian method compareTo() mem-pass-kan reference EntryAlamat yang lain. Objek EntryAlamat yang menjalankan method compareTo() harus memutuskan apakah EntryAlamat lain yang di-pass-kan kepadanya di-sort lebih tinggi, rendah, atau sama dalam list. </p>
<p>Sekarang pertanyaannya, apa yang membuat EntryAlamat yang satu lebih tinggi, rendah, atau sama dengan EntryAlamat yang lain? Inilah yang kemudian ditentukan oleh kita. Kita maunya berdasarkan apa. Kita ingin men-sort berdasarkan nama, maka kita meng-compare nama pada EntryAlamat yang satu dengan nama pada EntryAlamat yang lain. Terus, bagaimana membandingkan nama? Kita gunakan saja method compareTo yang dimiliki String. Nama kita kan berupa String, sehingga kita panggil nama dengan method compareTo(). Method ini tahu bagaimana membandingkan alphabet. <strong>Done</strong>&#8230;.</p>
<p>Sekarang, kita coba test dengan kelas tester berikut yang didalamnya memanggil method sort pada kelas Collections (<strong>SortingEntryAlamat.java</strong>).</p>
<pre class="brush: java;">import java.util.*;

public class SortingEntryAlamat {

       public static void main(String[] args) {
	       new SortingEntryAlamat().test();
       }

       public void test() {
	       ArrayList&lt;EntryAlamat&gt; listAlamat = new ArrayList&lt;EntryAlamat&gt;();       

	       // Sampel
	       listAlamat.add(new EntryAlamat(&quot;Yayak&quot;, &quot;Gedongkuning&quot;));
	       listAlamat.add(new EntryAlamat(&quot;Paijo&quot;, &quot;Babadan&quot;));
	       listAlamat.add(new EntryAlamat(&quot;Andi&quot;, &quot;Janti&quot;));
	       listAlamat.add(new EntryAlamat(&quot;Budi&quot;, &quot;Tegalrejo&quot;));

	       System.out.println(&quot;Sebelum di-sort:&quot;);
	       System.out.println(listAlamat);

	       // Sort entry berdasarkan nama
	       Collections.sort(listAlamat);
	       System.out.println(&quot;\nSetelah di-sort berdasarkan nama:&quot;);
	       System.out.println(listAlamat);
       }
}
</pre>
<p>Outputnya:<br />
<img src="http://oopclass2008.files.wordpress.com/2008/12/picture-6.png?w=500&#038;h=144" alt="picture-6" title="picture-6" width="500" height="144" class="alignnone size-full wp-image-151" /></p>
<p>Yeepp, inilah yang kita inginkan.<br />
<strong>Bagaimana, keren tidak? Ya,ya,ya lumayan &#8230;..</strong> <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Kemudian, kita ingin tidak hanya sort berdasarkan nama, tapi juga berdasarkan alamat. Kita akan melihat cara men-sort-nya di postingan berikutnya di <strong>Sorting Bagian 2</strong>&#8230; </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/oopclass2008.wordpress.com/147/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/oopclass2008.wordpress.com/147/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/oopclass2008.wordpress.com/147/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/oopclass2008.wordpress.com/147/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/oopclass2008.wordpress.com/147/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/oopclass2008.wordpress.com/147/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/oopclass2008.wordpress.com/147/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/oopclass2008.wordpress.com/147/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/oopclass2008.wordpress.com/147/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/oopclass2008.wordpress.com/147/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oopclass2008.wordpress.com&blog=4788351&post=147&subd=oopclass2008&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://oopclass2008.wordpress.com/2008/12/05/sorting-bagian-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86374896a940a7345a76fe3d26824889?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">oopclass2008</media:title>
		</media:content>

		<media:content url="http://oopclass2008.files.wordpress.com/2008/12/picture-3.png" medium="image">
			<media:title type="html">picture-3</media:title>
		</media:content>

		<media:content url="http://oopclass2008.files.wordpress.com/2008/12/picture-4.png" medium="image">
			<media:title type="html">picture-4</media:title>
		</media:content>

		<media:content url="http://oopclass2008.files.wordpress.com/2008/12/picture-5.png" medium="image">
			<media:title type="html">picture-5</media:title>
		</media:content>

		<media:content url="http://oopclass2008.files.wordpress.com/2008/12/picture-6.png" medium="image">
			<media:title type="html">picture-6</media:title>
		</media:content>
	</item>
		<item>
		<title>Producer Consumer Problem</title>
		<link>http://oopclass2008.wordpress.com/2008/12/04/producer-consumer-problem/</link>
		<comments>http://oopclass2008.wordpress.com/2008/12/04/producer-consumer-problem/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 10:28:15 +0000</pubDate>
		<dc:creator>oopclass2008</dc:creator>
				<category><![CDATA[Kuliah]]></category>

		<guid isPermaLink="false">http://oopclass2008.wordpress.com/?p=138</guid>
		<description><![CDATA[Setelah membaca dan mem-postkan Strategy Pattern, saya ingin intermezzo dulu. Capek juga euy baca topik tentang design pattern. 
Beberapa hari lalu saya melihat postingan mengenai masalah Producer Consumer di sini. Teman saya yang mem-post-kan. Ternyata merupakan implementasi dari pseudocode soal di ujian sistem operasinya. Wah rajin banget euy!
Di situ, terdapat kode producer consumer dalam bahasa [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oopclass2008.wordpress.com&blog=4788351&post=138&subd=oopclass2008&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Setelah membaca dan mem-postkan Strategy Pattern, saya ingin intermezzo dulu. Capek juga euy baca topik tentang design pattern. </p>
<p>Beberapa hari lalu saya melihat postingan mengenai <a href="http://curiousjava.wordpress.com/2008/10/31/pembahasan-soal-so-no-4/">masalah Producer Consumer di sini</a>. Teman saya yang mem-post-kan. Ternyata merupakan implementasi dari pseudocode soal di ujian sistem operasinya. Wah rajin banget euy!</p>
<p>Di situ, terdapat kode producer consumer dalam bahasa java. Katanya, pseudocode-nya tidak aman. Dan benar juga, ketika dijalankan, outputnya menyatakan terjadi <strong>buffer overflow</strong>. Ini dia tampilannya saat saya jalankan di komputer.<br />
<a href="http://oopclass2008.files.wordpress.com/2008/12/picture-1.png"><img src="http://oopclass2008.files.wordpress.com/2008/12/picture-1.png?w=500&#038;h=272" alt="picture-1" title="picture-1" width="500" height="272" class="alignnone size-full wp-image-140" /></a></p>
<p>Perkiraan awal saya, mungkin ini ada variabel yang di-share bersama. Jadi kalau tidak dilindungi, bisa gawat. Kemudian saya trace program-nya. Oh, di situ ada variabel <strong>count</strong>. Mungkin ini yang jadi masalah, karena diakses oleh producer dan consumer. Kemudian di java ada modifier <strong>synchronized</strong> untuk mencegah ada lebih dari satu objek mengakses method secara bersamaan. Saya coba synchronize-kan saja method yang menggunakan variabel count. </p>
<p>Kemudian saya compile dan jalankan. Arrgh&#8230;. masih terjadi buffer overflow. Saya cek lagi program-nya. Terus saya lihat ternyata producer dan consumer tidak mengakses method yang sama. Ketika mengubah variabel count, producer menggunakan method <strong>incCount()</strong>. Sedangkan consumer menggunakan <strong>decCount()</strong>. Dengan begitu, tidak ada gunanya di-synchronize. </p>
<p>Saya trace lagi, dan menemukan bahwa pengaksesan variable tidak ada yang jadi masalah. Akhirnya pencerahan itu datang. Letak masalahnya ada di statement </p>
<pre class="brush: java;">if (buffer.getCount() == 0) {
                try {
                    Thread.sleep(tts);
                } catch (InterruptedException e) {
                    //e.printStackTrace();
                }
            }
</pre>
<p>Saya sebelumnya mengira, statement ini menyatakan consumer akan terus sleep ketika buffer-nya masih kosong. Tapi asumsi saya salah. Ia hanya mengecek sekali, kemudian sleep beberapa lama, setelah itu wake dan melakukan remove item, meskipun bisa saja item pada buffer belum tersedia alias buffer-nya masih kosong. Mungkin di saat awal tidak terjadi masalah. Tapi beberapa cycle kemudian, timing-nya  tidak bisa menjamin ketika consumer wake lagi, buffer-nya pasti ada item-nya.</p>
<p>Sebelum melakukan remove item dari buffer, consumer harus memastikan dulu buffer-nya ada item-nya. Ini bisa dilakukan dengan mengganti pengecekannya dengan </p>
<pre class="brush: java;">while( buffer.getCount()==0) { }.
</pre>
<p>Jadi selama masih kosong, do nothing. Cara itu untuk mencegah <strong>buffer underflow</strong>.<br />
Untuk mencegah <strong>buffer overflow</strong>, pengecekan pada producer dapat diganti menjadi </p>
<pre class="brush: java;">while (buffer.getCount() == buffer.getBufferSize()) { }
</pre>
<p>Selama masih penuh, do nothing. </p>
<p>Yah, sebenarnya kurang efektif sih pengecekan seperti itu. Kalau bisa processor langsung pindah dari consumer ketika buffer masih kosong, dan bukan berada terus di consumer dengan tidak melakukan apa-apa. Menyia-nyiakan waktu quantum saja! </p>
<p>Tapi untuk sementara itu dulu solusinya. Yang penting tidak ada buffer overflow atau buffer underflow <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> .</p>
<p>Ini dia listing kode yang sedikit saya modifikasi. Bedanya, dengan mengimplementasikan runnable, kemudian waktu main-nya membuat thread dari producer dan consumer. Nggak ada alasan khusus sih. Saya cuma tahu cara buat thread seperti ini.</p>
<pre class="brush: java;">import java.util.*;

public class Buffer {
    private Vector buffer;
    private int bufferSize;
    private int count;

    public Buffer(int bufferSize) {
        this.buffer = new Vector(bufferSize);
        this.bufferSize = bufferSize;
        this.count = 0;
    }

    public synchronized void enterItem(String item) {
        buffer.add(item);
        System.out.println(item + &quot; added.&quot;);
        if (buffer.size()&gt;bufferSize) {
            System.err.println(&quot;\tBuffer overflow!!...&quot;);
        }
    }

    public synchronized String removeItem() {
        Object result;
        try {
        result = buffer.remove(0);
        } catch (Exception e) {
            System.err.println(&quot;\tBuffer underflow!!...&quot;);
            return &quot;&quot;;
        }

        System.out.println(&quot;&quot; + result + &quot; removed.&quot;);
        return &quot;&quot; + result;
    }

    public void incCount() {
        count++;
    }

    public void decCount() {
        count--;
    }

    public int getBufferSize() {
        return bufferSize;
    }

    public int getCount() {
        return count;
    }

    public synchronized String toString() {
        StringBuffer sb = new StringBuffer(buffer.size());
        for (Object o:buffer) {
            if (o!=null) {
                sb.append(&quot;# &quot;);
            }
        }

        return &quot;&quot; + count + &quot;: &quot; + sb.toString();
    }
}
</pre>
<pre class="brush: java;">
public class Producer implements Runnable {
    private Buffer buffer;
    private long tts;

    private Consumer consumer;

    //--
    String item;
    private int msgId = 0;

    public Producer(Buffer buffer, long tts) {
        this.buffer = buffer;
        this.tts = tts;

        //setDaemon(false);
    }

    public void setConsumer(Consumer consumer) {
        this.consumer = consumer;
    }

    public void run() {
        while (true) {
            item = &quot;msg &quot; + ++msgId;

//	    if (buffer.getCount() == buffer.getBufferSize()) {
//                try {
//                    Thread.sleep(tts);
//                } catch (InterruptedException e) {
//                    //e.printStackTrace();
//                }
//            }

	while (buffer.getCount() == buffer.getBufferSize())
			{
			}

            buffer.enterItem(item);
            buffer.incCount();

            if (buffer.getCount() == 1)
                synchronized (consumer) {
                    consumer.notifyAll();
                }
        }
    }
}
</pre>
<pre class="brush: java;">public class Consumer implements Runnable {

    private Buffer buffer;
    private long tts;

    private Producer producer;

    //--
    private String item;

    public Consumer(Buffer buffer, long tts) {
        this.buffer = buffer;
        this.tts = tts;

        //setDaemon(false);
    }

    public void setProducer(Producer producer) {
        this.producer = producer;
    }

    public void run() {
        while (true) {

//           if (buffer.getCount() == 0) {
//               try {
//                   Thread.sleep(tts);
//               } catch (InterruptedException e) {
//                   //e.printStackTrace();
//               }
//           }

	   while (buffer.getCount() == 0)
			{
			}

            item = buffer.removeItem();
            buffer.decCount();

            if (buffer.getCount() == buffer.getBufferSize() - 1) {
                synchronized (producer) {
                    producer.notifyAll();
                }
            }

            System.out.println(&quot;Consumer consumes &quot; + item);
        }
    }
}
</pre>
<pre class="brush: java;">public class ProducerConsumerDemo {

	public static void main(String[] args) {
		// Contoh kasus
		// buffernya hanya berkapasitas
		// satu item
		Buffer buffer = new Buffer(1);

		Producer producer = new Producer(buffer, 500);
		Consumer consumer = new Consumer(buffer, 500);
		producer.setConsumer(consumer);
		consumer.setProducer(producer);

		Thread one = new Thread(producer);
		Thread two = new Thread(consumer);

		one.start();
		two.start();
	}
}
</pre>
<p>Tampilan outputnya:<br />
<a href="http://oopclass2008.files.wordpress.com/2008/12/picture-2.png"><img src="http://oopclass2008.files.wordpress.com/2008/12/picture-2.png?w=499&#038;h=276" alt="picture-2" title="picture-2" width="499" height="276" class="alignnone size-full wp-image-143" /></a><br />
Setelah message ke 7798, syukurlah tidak ada pesan buffer overflow atau buffer underflow.</p>
<p>Mungkin ada teman yang punya solusi yang lebih baik. Share dong!</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/oopclass2008.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/oopclass2008.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/oopclass2008.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/oopclass2008.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/oopclass2008.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/oopclass2008.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/oopclass2008.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/oopclass2008.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/oopclass2008.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/oopclass2008.wordpress.com/138/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oopclass2008.wordpress.com&blog=4788351&post=138&subd=oopclass2008&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://oopclass2008.wordpress.com/2008/12/04/producer-consumer-problem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86374896a940a7345a76fe3d26824889?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">oopclass2008</media:title>
		</media:content>

		<media:content url="http://oopclass2008.files.wordpress.com/2008/12/picture-1.png" medium="image">
			<media:title type="html">picture-1</media:title>
		</media:content>

		<media:content url="http://oopclass2008.files.wordpress.com/2008/12/picture-2.png" medium="image">
			<media:title type="html">picture-2</media:title>
		</media:content>
	</item>
		<item>
		<title>Strategy Pattern (Bagian 5)</title>
		<link>http://oopclass2008.wordpress.com/2008/12/04/strategy-pattern-bagian-5/</link>
		<comments>http://oopclass2008.wordpress.com/2008/12/04/strategy-pattern-bagian-5/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 08:59:58 +0000</pubDate>
		<dc:creator>oopclass2008</dc:creator>
				<category><![CDATA[Kuliah]]></category>

		<guid isPermaLink="false">http://oopclass2008.wordpress.com/?p=132</guid>
		<description><![CDATA[Kali ini merupakan postingan terakhir dari cerita kita tentang Joe dan Bebek-Bebeknya. Karena judulnya Strategy Pattern, maka kita perlu menunjukkan kaitan antara apa yang telah kita lakukan dengan apapun itu yang bernama Strategy Pattern. Apakah ada kaitannya? Tentu ada. Kalau tidak, buat apa kita capek-capek bercerita!
Namun sebelum sampai ke arah situ, kita recap dulu apa [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oopclass2008.wordpress.com&blog=4788351&post=132&subd=oopclass2008&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Kali ini merupakan postingan terakhir dari cerita kita tentang <strong>Joe dan Bebek-Bebeknya</strong>. Karena judulnya Strategy Pattern, maka kita perlu menunjukkan kaitan antara apa yang telah kita lakukan dengan apapun itu yang bernama Strategy Pattern. Apakah ada kaitannya? Tentu ada. Kalau tidak, buat apa kita capek-capek bercerita!</p>
<p>Namun sebelum sampai ke arah situ, kita recap dulu apa yang telah kita lakukan. Saatnya kita melihat big picture-nya&#8230;.<br />
<a href="http://oopclass2008.files.wordpress.com/2008/12/big-picture-duck.jpg"><img src="http://oopclass2008.files.wordpress.com/2008/12/big-picture-duck.jpg?w=500&#038;h=268" alt="big-picture-duck" title="big-picture-duck" width="500" height="268" class="alignnone size-full wp-image-133" /></a></p>
<p>Gambar di atas merupakan struktur kelas secara keseluruhan yang telah kita gunakan. Di situ para duck meng-extend kelas Duck, kelas-kelas behavior mengimplementasikan interface FlyBehavior dan QuackBehavior. Ok, kita sudah tahu ceritanya.</p>
<p>Nah, sekarang, kita tidak lagi menyebut kelas-kelas behavior tetapi menyebutnya sebagai <strong>familiy dari algoritma-algoritma</strong>. Jadi, dari kelas-kelas behavior FlyBehavior menjadi sebuah <strong>familiy algoritma flying</strong>. Begitu juga, kelas-kelas behavior QuackBehavior menjadi sebuah <strong>family algoritma quacking</strong>. Dalam konteks game simulasi Duck ini, suatu algoritma merepresentasikan hal-hal yang dilakukan seekor duck (Cara terbang dan cara ber-kwek yang berbeda). </p>
<p>Client Duck menggunakan family algoritma ini untuk terbang dan ber-kwek-kwek.</p>
<p>&#8230;&#8230;&#8230;Dan itulah yang kita namakan <strong>Strategy Pattern</strong>.<br />
Inilah definisi formalnya:</p>
<blockquote><p>Strategy Pattern mendefinisikan sekumpulan family algoritma-algoritma, meng-enkapsulasi-kan satu sama lain, dan membuatnya bisa ditukar-tukar. Strategy ini membuat algoritma dapat berubah secara independen dari Client yang menggunakannya.</p></blockquote>
<p>Gunakan definisi ini untuk mengesankan saudara, teman, mertua &#8230; <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/oopclass2008.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/oopclass2008.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/oopclass2008.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/oopclass2008.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/oopclass2008.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/oopclass2008.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/oopclass2008.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/oopclass2008.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/oopclass2008.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/oopclass2008.wordpress.com/132/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oopclass2008.wordpress.com&blog=4788351&post=132&subd=oopclass2008&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://oopclass2008.wordpress.com/2008/12/04/strategy-pattern-bagian-5/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86374896a940a7345a76fe3d26824889?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">oopclass2008</media:title>
		</media:content>

		<media:content url="http://oopclass2008.files.wordpress.com/2008/12/big-picture-duck.jpg" medium="image">
			<media:title type="html">big-picture-duck</media:title>
		</media:content>
	</item>
		<item>
		<title>Strategy Pattern (Bagian 4)</title>
		<link>http://oopclass2008.wordpress.com/2008/12/04/strategy-pattern-bagian-4/</link>
		<comments>http://oopclass2008.wordpress.com/2008/12/04/strategy-pattern-bagian-4/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 06:54:19 +0000</pubDate>
		<dc:creator>oopclass2008</dc:creator>
				<category><![CDATA[Kuliah]]></category>

		<guid isPermaLink="false">http://oopclass2008.wordpress.com/?p=125</guid>
		<description><![CDATA[Ok, saya bohong. Postingan ini bukanlah akhir dari cerita kita. Kita akan bersenang-senang dulu. Setelah kita mempunyai behavior class dari FlyBehavior dan QuackBehavior, kenapa kita tidak memanfaatkannya untuk men-set behavior secara dinamik. Is that cool?! 
Jadi, kita ingin men-set tipe behavior dari Duck lewat method setter, dan bukannya menginisialisasinya di constructor.
Ok, let&#8217;s start&#8230;.
Kita buat kelas [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oopclass2008.wordpress.com&blog=4788351&post=125&subd=oopclass2008&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Ok, saya bohong. Postingan ini bukanlah akhir dari cerita kita. Kita akan bersenang-senang dulu. Setelah kita mempunyai behavior class dari FlyBehavior dan QuackBehavior, kenapa kita tidak memanfaatkannya untuk men-set behavior secara dinamik. <em>Is that cool?! </em></p>
<p>Jadi, kita ingin men-set tipe behavior dari Duck lewat <strong>method setter</strong>, dan bukannya menginisialisasinya di <strong>constructor</strong>.</p>
<p><strong>Ok, let&#8217;s start&#8230;.</strong></p>
<p>Kita buat kelas Duck seperti sebelumnya, tapi kali ini kita tambahkan dua method baru, yaitu <strong>setFlyBehavior</strong> dan <strong>setQuackBehavior</strong>. Ketika dipanggil, method ini akan men-set behavior. </p>
<pre class="brush: java;">public abstract class Duck {
	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior;

	public Duck() {
	}

	public void swim() {
		System.out.println(&quot;Saya berenang....&quot;);
	}

	public abstract void display();

	public void performFly() {
		flyBehavior.fly();
	}

	public void performQuack() {
		quackBehavior.quack();
	}

	public void setFlyBehavior(FlyBehavior fb) {
		flyBehavior = fb;
	}

	public void setQuackBehavior(QuackBehavior qb) {
		quackBehavior = qb;
	}
}
</pre>
<p>Terus, kita tambahkan tipe Duck baru, ModelDuck, dengan menuliskan kelas <strong>ModelDuck.java</strong>.</p>
<pre class="brush: java;">public class ModelDuck extends Duck {
	public ModelDuck() {
		flyBehavior = new FlyNoWay();
		quackBehavior = new Quack();
	}

	public void display() {
		System.out.println(&quot;Saya adalah Model Duck&quot;);
	}
}
</pre>
<p>Mula-mula kita set ModelDuck, tidak dapat terbang.</p>
<p>Selanjutnya kita tambahkan satu tipe baru dari FlyBehavior, yaitu terbang dengan kekuatan roket. Kita tuliskan kelas <strong>FlyRocketPowered.java</strong>.</p>
<pre class="brush: java;">public class FlyRocketPowered implements FlyBehavior {
	public void fly() {
		System.out.println(&quot;Saya terbang dengan roket&quot;);
	}
}
</pre>
<p>Langkah terakhir, kita ubah kelas tester <strong>MiniDuckSimulator.java</strong> dengan menambahkan ModelDuck dan membuat ModelDuck terbang dengan kekuatan roket. Ini dia kelas testernya.</p>
<pre class="brush: java;">public class MiniDuckSimulator {
	public static void main(String[] args) {
		Duck mallard = new MallardDuck();
		mallard.performQuack();
		mallard.performFly();

		System.out.println(&quot;----------------&quot;);
		System.out.println(&quot;Model Duck&quot;);
		Duck model = new ModelDuck();
		model.performFly();

		// Kita ubah supaya dapat terbang
		// dengan roket
		model.setFlyBehavior(new FlyRocketPowered());
		model.performFly();
	}
}
</pre>
<p>Kita compile, jalankan, dan outputnya &#8230;.<br />
<a href="http://oopclass2008.files.wordpress.com/2008/12/output-model-duck-fly.jpg"><img src="http://oopclass2008.files.wordpress.com/2008/12/output-model-duck-fly.jpg?w=500&#038;h=178" alt="output-model-duck-fly" title="output-model-duck-fly" width="500" height="178" class="alignnone size-full wp-image-126" /></a></p>
<p><strong>Yayay!</strong> Yang semula ModelDuck tidak dapat terbang, akhirnya dapat terbang dengan kekuatan roket setelah kita men-set FlyRocketPowered. Dengan cara ini, kita dapat mengubah behavior dari Duck saat runtime. Tinggal panggil saja method setter untuk behavior tersebut. </p>
<p><strong>Ok, now what?</strong><br />
kita akan benar-benar <em>wrap-up</em> cerita ini di <strong>Strategy Pattern Bagian 5</strong>. Di sana juga akan muncul definisi Strategy Pattern. Gunakan definisi itu untuk mengesankan teman-teman. <em>So trust me, and stay tuned&#8230;.</em></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/oopclass2008.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/oopclass2008.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/oopclass2008.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/oopclass2008.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/oopclass2008.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/oopclass2008.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/oopclass2008.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/oopclass2008.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/oopclass2008.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/oopclass2008.wordpress.com/125/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=oopclass2008.wordpress.com&blog=4788351&post=125&subd=oopclass2008&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://oopclass2008.wordpress.com/2008/12/04/strategy-pattern-bagian-4/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/86374896a940a7345a76fe3d26824889?s=96&#38;d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D96" medium="image">
			<media:title type="html">oopclass2008</media:title>
		</media:content>

		<media:content url="http://oopclass2008.files.wordpress.com/2008/12/output-model-duck-fly.jpg" medium="image">
			<media:title type="html">output-model-duck-fly</media:title>
		</media:content>
	</item>
	</channel>
</rss>