Posts tagged ‘OOP’

Inner Class dan Keyword this

Salah satu bagian dimana aku harus sering memakai inner class adalah saat merancang tampilan user interface aplikasi melalui Swing. Jika berbicara mengenai inner class, ada sebuah syntax sederhana tetapi sangat membantu yang berkaitan dengan this.

Sebagai contoh, misalnya aku memiliki JFrame sederhana seperti berikut:

public class MainGUI extends JFrame {

	public MainGUI() {
		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		addWindowListener(new WindowHandler());

		...

		pack();
		setVisible(true);
	}

	protected class WindowHandler extends WindowAdapter {

		@Override
		public void windowClosing(WindowEvent e) {
			System.exit(0);
		}

	}
}

Pada program di atas, aku membuat sebuah inner class WindowHandler yang berfungsi sebagai WindowListener. Seandainya aku memiliki menu Exit di tampilan, atau sebuah tombol yang berfungsi untuk keluar dari program, tentu aku akan membuat Action yang akan dipakai oleh menu/tombol tersebut sehingga struktur program menjadi:

public class MainGUI extends JFrame {

	public MainGUI() {
		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		addWindowListener(new WindowHandler());
		JMenuItem menuFileExit = new JMenuItem(new ExitHandler());

		...

		pack();
		setVisible(true);
	}

	protected class WindowHandler extends WindowAdapter {

		@Override
		public void windowClosing(WindowEvent e) {
			logger.debug("Frame is closing");
			System.exit(0);

		}

	}

	protected class ExitHandler extends AbstractAction {

		@Override
		public void actionPerformed(ActionEvent e) {
			....
		}
	}
}

Sekarang, aku akan men-coding bagian actionPerformed dari class ExitHandler yang merupakan inner class dari class MainGUI. Aku ingin ia nantinya akan memanggil windowClosing milik WindowHandler. Seharusnya tidak susah, karena aku membuat kode seperti:

item.windowClosing(new WindowEvent(..., WindowEvent.WINDOW_CLOSING));

Parameter pertama dari construct WindowEvent adalah sebuah Window, dalam kasus aku adalah JFrame (yang masih turunan dari Window). Bagaimana aku bisa mendapatkan JFrame MainGUI? Soalnya aku sekarang berada di inner class ExitHandler. Jika aku menkode seperti:

item.windowClosing(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));

Yang dimaksud dengan this disini adalah instance class saat ini yaitu ExitHandler. Tentunya hasilnya adalah kesalahan. Lalu bagaimana mendapatkan instance dari outer class, MainGUI? Aku bisa menkode seperti:

item.windowClosing(new WindowEvent(MainGUI.this, WindowEvent.WINDOW_CLOSING));

26 Mei 2009 at 12:34 AM Tinggalkan Komentar

Sekilas Mengenai Bahasa Java

Beberapa hari terakhir ini, aku sering mengikuti test technical yang berkaitan dengan Java. Sebagai persiapan,
aku membaca ulang lagi topik-topik tentang bahasa pemograman Java. Maklum saja, kebanyakan pertanyaan dalam
test masuk adalah pertanyaan dasar yang harus dikerjakan dalam waktu singkat. Aku akan menuliskan beberapa hal
yang jarang aku pakai di Java dan yang belum ada di Java saat aku mempelajarinya dulu.

Salah satu calon pertanyaan yang mungkin bisa mengecoh adalah apakah syntax berikut valid?

instanceB = instanceA.new classB();

Jika dilihat sekilas, bentuk syntax di atas sangat tidak lazim, sepertinya syntax tersebut tidak valid? Tapi
sebenarnya, syntax tersebut sah untuk membuat instance dari inner class, dimana lengkapnya berupa:

public class Latihan {

	public static void main(String[] args) {
		ClassA instanceA = new ClassA();
		ClassA.ClassB instanceB = instanceA.new ClassB();
		instanceB.cetak();
	}

}

class ClassA {
	
	public class ClassB {
		public void cetak() {
			System.out.println("TEST");
		}
	}
	
}

Untungnya, selama ini, aku belum menemukan test technical yang memberikan soal seperti itu. Berikutnya, aku
menemukan sesuatu yang mirip seperti printf() di C/C++, yaitu System.out.format.
Berikut ini adalah contoh penggunaannya:

System.out.format("Selamat datang %s.%nHari ini tanggal %2$td-%2$tm-%2$tY", 
  "Solid Snake", new java.util.Date());

yang akan menghasilkan keluaran seperti:

Selamat datang Solid Snake.
Hari ini tanggal 09-05-2009

Terlihat sedikit lebih canggih dibanding printf() karena dapat men-format tanggal secara langsung.
Masih berhubungan dengan formatting, yaitu class DecimalFormat yang dapat dipergunakan untuk
men-format bilangan desimal, seperti pada contoh:

DecimalFormat decimalFormat = new DecimalFormat();
decimalFormat.setMaximumFractionDigits(2);
decimalFormat.setNegativePrefix("(");
decimalFormat.setNegativeSuffix(")");
decimalFormat.setRoundingMode(RoundingMode.DOWN);

System.out.println(decimalFormat.format(543553.3433));
System.out.println(decimalFormat.format(-543434.3));

Hasil keluaran dari program di atas terlihat seperti:

543.553,34
(543.434,3)

Ada sebuah class yang mempermudah parsing tanpa harus membuat regex secara manual, yaitu Scanner. Sebagai contoh,
aku membuat program sederhana yang membaca sebuah file TXT, lalu menjumlahkan semua bilangan integer yang
ada dalam file tersebut. Misalnya, isi file tersebut adalah:

#ini adalah file latihan
#untuk menggunakan scanner
#
10 # test angka sepuluh
30 # test angka tiga puluh
50

Kode program yang aku buat adalah:

fis = new FileInputStream("C:\\test.txt");
Scanner scanner = new Scanner(fis);
int total = 0;
while (scanner.hasNext()) {
	if (scanner.hasNextInt()) {
		total += scanner.nextInt();
	} else {
		scanner.next();
	}
}
System.out.println("Hasil jumlah bilangan integer yang ada = " + total);

Kode di atas terlihat ringkas bukan? Parsing kini menjadi kerjaan mudah dengan bantuan Scanner.
Contoh output program di atas seperti:

Hasil jumlah bilangan integer yang ada = 90

Masih ingat pengalaman pertama kali belajar Java? Kebanyakan buku-buku teks Java pada saat aku masih belajar Java
menunda pembahasan mengenai input dari keyboard. Alasannya adalah Java tidak menyediakan cara gampang untuk
membaca dari keyboard tanpa harus mengerti konsep stream (System.in). Dan sekarang, aku
menemukan sebuah class Console (baru sejak versi 1.6) untuk menangani input dari console.
Berikut ini adalah contoh penggunaannya:

Console console = System.console();
if (console==null) {
	System.out.println("System Anda tidak mendukung input console");
} else {
	System.out.println("Masukkan nama Anda: ");
	String nama = console.readLine();
	System.out.println("Masukkan password Anda: ");
	char[] password = console.readPassword();
	String strPassword = new String(password);
	if (strPassword.equals("SOLIDSNAKE")) {
		System.out.println("Password Anda benar!");
	} else {
		System.out.println("Password Anda salah!");
	}
}

Salah satu alasan Java tidak menyertakan Console dari awal adalah tidak semua platform mendukung
input dari keyboard. Jika kondisi tidak memungkinkan untuk menerima input dari keyboard, misalnya saat
menjalankan program di atas melalui Eclipse, System.console() akan bernilai null.
Untuk mencoba program di-atas, aku menjalankannya melalui Command Prompt. O ya, pada saat readPassword()

dipanggil, input dari keyboard tidak akan ditampilkan (di-echo) ke layar.

09 Mei 2009 at 8:56 AM 1 komentar


Arsip


Ikuti

Get every new post delivered to your Inbox.