• Tidak ada hasil yang ditemukan

Class Penting

Dalam dokumen c2ed0 java desktop ifnu bima (Halaman 89-94)

}

Coba tebak hasil eksekusi kode di atas! Apakah tebakanya sama dengan hasil eksekusinya seperti di bawah ini ?

$ javac CopyPartialArrayTest.java $ java CopyPartialArrayTest setelah dipotong : [me, you]

setelah ditambah panjang : [me, you, they, us, null, null, null] setelah dipotong : [you, they]

setelah dipotong dan bertambah panjang: [they, us, null, null, null, null, null, null]

$

Sisanya, method-metthod seperti : sort dan binarySearch sama persis penggunaanya dengan method yang ada dalam class Collections.

Class Penting

JDK menyertakan banyak sekali class-class yang berguna untuk memudahkan developer membuat aplikasi. Beberapa class sangat penting fungsinya sehingga perlu diperhatikan bagaimana menggunakanya dengan benar.

String, StringBuilder, StringBufer

String adalah class yang bersifat immutable, artinya sekali diset nilainya maka tidak bisa lagi diubah. String yang bersifat immutable juga berarti bahwa kalau kita melakukan modifkasi terhadap object String, pada dasarnya hasil modifkasi ini adalah object baru. Hal ini yang membuat String ini menjadi tidak efsien digunakan pada saat diperlukan manipulasi String dalam skala yang cukup besar. Mari kita lihat contoh kode yang menunjukkan class String immutable :

public class StringImmutableTest {

public static void main(String[] args){ String s = "ini string immutable ";

System.out.println("sebelum operasi concat nilai s : " + s); //append tidak merubah variabel s, tetapi dibuat object baru //dan object baru ini direturn sedangkan variabel s nilainya tetap s.concat("concat");

System.out.println("setelah operasi concat nilai s : " + s); String concat = s + s.concat("concat") + " object baru"; }

}

Hasil eksekusi kode di atas adalah : $ javac StringImmutableTest.java $ java StringImmutableTest

sebelum operasi concat nilai s : ini string immutable setelah operasi concat nilai s : ini string immutable $

Sebelum dan sesudah operasi concat nilai variabel s tetap, hal ini terjadi karena proses concat dari class String akan membuat object baru kemudian dilakukan concat antara nilai yang sekarang dipunyai oleh variabel s dengan string yang ada dalam parameter, dan object baru ini

direturn. Proses concat tidak merubah nilai yang dipunyai oleh variabel s, karena class String immutable, sekali nilainya diset tidak bisa diubah lagi.

Perhatikan juga proses string concatenantion dengan menggunakan operator + di atas, operasi ini jika dilakukan menggunakan String akan menghasilkan banyak sekali object baru, yang pertama adalah object hasil operasi append dari variabel s, kemudian object penggabungan variabel s dengan s.concat dan terakhir hasil penggabungan ketiga string tersebut.

Kalau proses concatenation atau pengolahan String secara umum dalam skala yang sangat besar, maka akan menyebabkan penggunaan memory yang tidak efsien. Kalau kita dihadapkan dengan masalah tersebut sebaiknya jangan menggunakan class String, selalu gunakan class StringBuilder atau StringBufer.

Class StringBufer dibuat untuk tujuan efsiensi, karena StringBufer bukan class immutable seperti class String. StringBufer mempunyai kemampuan untuk digunakan dalam lingkungan multi threading karena sifatnya yang thread safe, tetapi feature ini menyebabkan class StringBufer tidak efsien dari sisi komputasi CPU, karena thread safe memerlukan pengecekan apakah yang melakukan operasi terhadap class StringBufer ini adalah thread yang sama, kalau threadnya berbeda maka prosesnya disuruh mengantri dan hanya satu thread dalam satu waktu yang bisa melakukan manipulasi class StringBufer ini.

Class StringBuilder mempunyai tujuan yang sama persis dengan class StringBufer, tetapai StringBuilder tidak mempunyai fasilitas thread safe, sehingga performanya lebih cepat. Kalau kita tidak memerlukan fasilitas thread safe maka StringBuilder adalah class yang tepat digunakan untuk manipulasi string.

Mari kita rubah kode sebelumnya dengan mengganti class String menjadi StringBuilder dan kita lihat perbedaanya :

public class StringBuilderTest {

public static void main(String[] args){

StringBuilder s = new StringBuilder("ini StringBuilder tidak immutable "); System.out.println("sebelum operasi concat nilai s : " + s);

//append merubah variabel s,

//setelah proses append nilai variabel s akan berubah s.append("concat");

System.out.println("setelah operasi concat nilai s : " + s); s.append(s.append("concat")).append(" object baru");

} }

Hasil eksekusi kode di atas adalah : $ javac StringBuilderTest.java $ java StringBuilderTest

sebelum operasi concat nilai s : ini StringBuilder tidak immutable setelah operasi concat nilai s : ini StringBuilder tidak immutable concat $

Mulai dari JDK 6, compiler java (javac) akan merubah operasi penggabungan String dengan menggunakan operasi append dari class StringBuilder secara otomatis. Misalnya kode di bawah ini :

String s = "ini string immutable ";

String concat = s + s.concat("concat") + " object baru";

kode di atas kalau dicompile menggunakan JDK 6 akan diubah kodenya menjadi seperti di bawah ini :

String s = "ini string immutable ";

StringBuilder builder = new StringBuilder();

String concat = builder.append(s).append(s.concat("concat")) .append(" object baru").toString();

Jadi kalau sudah menggunakan JDK 6 tidak perlu khawatir melakukan penggabungan string menggunakan class String dan operator +, tetapi memang sebaiknya selalu gunakan

StringBuilder.append untuk menekankan disiplin penggabungan string yang baik.

Date, Calendar, DateFormat

Bekerja dengan tanggal bukan pekerjaan yang mudah, terkadang kita perlu melakukan perhitungan berdasarkan tanggal yang cukup rumit, misalnya mendapatkan hari terakhir dari bulan tertentu atau mendapatkan selisih hari antara dua tanggal, atau bahkan bekerja dengan calendar selain Masehi, misalnya penanggalan Budha. Java menyediakan class-class yang bisa digunakan untuk tujuan tersebut, sehingga tidak perlu membuat kode untuk melakukan hal tersebut secara manual.

Class Date adalah representasi dari waktu di Java, class ini terdapat dua jenis: java.util.Date dan java.sql.Date. Class java.util.Date adalah class yang sering digunakan dalam perhitungan tanggal, sedangkan java.sql.Date adalah representasi data tanggal di java yang setara dengan tipe data date di dalam database. Kalau tidak bekerja dengan database, sebaiknya selalu gunakan java.util.Date, sedangkan java.sql.Date hanya digunakan ketika kita bekerja dengan database. Istilah class Date di dalam bab ini merujuk ke java.util.Date.

Waktu dalam perhitungan komputer direpresentasikan sebagai bilangan Long yang merupakan durasi antara tanggal 1 januari 1970 00:00:000 hingga waktu sekarang dalam mili detik. Pencatatan tanggal ini disimpan dalam BIOS dari PC. Dari kode java kita bisa mendapatkan waktu sekarang menggunakan kode :

Long waktuSekarang = System.currentTimeMillis();

nilai waktuSekarang adalah jarak antara tanggal 1 januari 1970 00:00:000 hingga kode ini dieksekusi dalam mili detik. Kalau ingin mendapatkan representasi yang lebih baik, kita bisa menggunakan class Date untuk mendapatkan waktu sekarang, seperti di bawah ini :

Date d = new Date(); int tahun = d.getYear(); int bulan = d.getMonth(); int tanggal = d.getDate();

Long waktuSekarang = d.getTime();

variabel d adalah instance dari class Date yang merepresentasikan waktu sekarang dan mempunyai method-method untuk mendapatkan bagian dari waktu seperti tahun, bulan, tanggal dan seterusnya. Class Date juga menyediakan constructor dengan parameter Long, sehingga nilai dari System.currentTimeMillis() bisa dimasukkan sebagai parameternya, seperti di bawah ini :

Long waktuSekarang = System.currentTimeMillis(); Date d = new Date(waktuSekarang);

Semenjak java 1.1, di dalam JDK ditambahkan class Calendar untuk memanipulasi nilai dari class Date ini, oleh karena itu banyak sekali method di dalam class Date yang sifatnya deprecated, sudah tidak didukung dan sebaiknya tidak digunakan lagi. Misalnya method-method seperti getDate, getMonth, getYear dan seterusnya kalau digunakan dan kodenya dicompile maka pada waktu kompilasi akan muncul warning bahwa method-method tersebut sudah deprecated. Contohnya seperti ini :

import java.util.Date;

public class DateDeprecatedTest {

public static void main(String[] args) { Date d = new Date();

int tahun = d.getYear(); int bulan = d.getMonth(); int tanggal = d.getDate();

Long waktuSekarang = d.getTime(); }

}

Kalau kita compile kode di atas, warning menerangkan bahwa ada kode yang deprecated akan terlihat seperti di bawah ini:

Note: DateDeprecatedTest.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details.

$

Class Date digunakan sebagai object untuk menyimpan waktu saja, hal ini terutama karena class Date mengimplementasikan interface Serializable, plus semua fungsi untuk perhitungan sudah ditandai deprecated.Sedangkan class Calendar digunakan layaknya kalkulator untuk proses perhitungan tanggal pada class Date, misalnya kita ingin menambahkan 1 hari, menambah 1 menit dan seterusnya. Calendar juga menyediakan sistem penanggalan Masehi (GregorianCalendar), penanggalan Budha dengan bahas Thailand dan penanggalan Jepang. Misalnya kita ingin membuat class Date dengan tanggal : 1 januari 2000, kodenya seperti di bawah ini :

Calendar calendar = Calendar.getInstance(); //secara default penanggalan yang digunakan adalah Masehi (GregorianCalendar);

calendar.set(2000,Calendar.JANUARY,1,0,0,0); Date d = calendar.getTime();

Kode di atas menggunakan Calendar.getInstance() untuk mendapatkan tanggal sekarang, class Calendar yang dikembalikan adalah GregorianCalendar yang merupakan implementasi penanggalan Masehi. Method set mempunyai beberapa bentuk (overloading) untuk mengeset nilai ke dalam calendar, bisa diset satu per satu atau diset hanya bulan-tanggal-tahun atau diset semuanya secara bersamaan seperti dalam contoh di atas.

Kita juga bisa langsung membuat instance dari GregorianCalendar menggunakan constructor seperti di bawah ini

Calendar calendar = new GregorianCalendar(2000,Calendar.JANUARY,1,0,0,0); Date d = calendar.getTime();

Class Calendar mempunyai method setTime untuk memasukkan object class Date ke dalam calendar, kemudian bisa dilakukan perhitungan dan setelah selesai object date bisa dikeluarkan dari calendar dengan menggunakan method getTime.

Untuk mendapatkan nilai individual dari waktu, class Calendar menyediakan method get dengan sebuah parameter yang menerangkan bagian apa dari calendar yang ingin diambil. Contohnya seperti di bawah ini :

Calendar calendar = Calendar.getInstance(); int tahun = calendar.get(Calendar.YEAR); int bulan = calendar.get(Calendar.MONTH); int tanggal = calendar.get(Calendar.DATE); int hari = calendar.get(Calendar.DAY_OF_WEEK);

Perlu diperhatikan bahwa nilai bulan yang diambil dari calender dimulai dari 0 hingga 11!!, berbeda dengan tanggal yang tidak ada nilai 0, perilaku ini kerap menimbulkan bug di dalam aplikasi karena anggapan umum bulan dimulai dari 1 hingga 12.

Method add dari class Calendar digunakan untuk menambahkan satuan waktu ke dalam calendar. Parameternya ada dua: satuan waktu dan berapa banyak nilai yang akan ditambahkan. Perhatikan contoh di bawah ini :

Calendar calendar = Calendar.getInstance();

calendar.add(Calendar.DATE, 1); //menambah satu hari calendar.add(Calendar.HOUR, 1); //menambah satu jam calendar.add(Calendar.YEAR, -1); //mengurangi satu tahun

Proses penambahan atau pengurangan menggunakan add akan merubah satuan waktu lebih besar. Misalnya sekarang tanggal 31 januari dan ditambah satu hari, maka hasilnya adalah 1 Februari. Kalau kita tidak ingin satuan waktu lebih besar ikut berubah karena proses penambahan/pengurangan gunakan method roll, seperti contoh di bawah ini:

Calendar calendar = new GregorianCalendar(2000,Calendar.JANUARY,31,0,0,0); calendar.roll(Calendar.DATE, 1); //hasilnya 1 januari 2000 bukan 1 februari 2000 Contoh di atas, kita menambah satu hari ke tanggal 31 Januari 2000, karena method yang

digunakan adalah roll dan 31 adalah tanggal terbesar untuk bulan januari maka tanggalnya akan dimulai lagi menjadi 1 tetapi bulannya tidak berubah, tetap januari.

Class Calendar juga mempunyai beberapa method lain yang cukup berguna, misalnya method getActualMaximum yang bisa digunakan untuk mengambil nilai maximum satuan waktu, kalau parameter dari getActualMaximum ini adalah Calendar.DAY_OF_MONTH maka akan direturn nilai tanggal terbesar dari bulan tersebut. Kalau Calendarnya mempunyai tanggal 1 Februari 2000 maka hasik dari getActualMaximum(Calendar.DAY_OF_MONTH) adalah 29. Contohnya seperti di bawah ini :

public class CalendarTest {

public static void main(String[] args) {

Calendar calendar = new GregorianCalendar(2000,Calendar.FEBRUARY,1); int maxFeb = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); System.out.println(maxFeb);

} }

DateFormat adalah class yang digunakan untuk memformat tanggal menjadi string. Class turunan dari DateFormat yang sering digunakan adalah SimpleDateFormat. Class SimpleDateFormat bisa digunakan untuk mengubah string menjadi tanggal dan sebaliknya dari tanggal menjadi String. Class ini sebaiknya dibuat setiap kali akan digunakan, hal ini dikarenakan class SimpleDateFormat tidak thread-safe, artinya kalau diinstansiasi sekali dan digunakan dalam lingkungan multithreading maka hasilnya tidak konsisten.

Format tanggal di Java menggunakan DateFormat ada aturanya, ada beberapa huruf yang digunakan sebagai simbol satuan waktu. Daftar huruf yang digunakan sebagai simbol satuan waktu adalah :

Huru f

Satuan waktu Tipe data Contoh

G Era Teks AD, BC

y Tahun Tahun 1996, 96

M Bulan Bulan 11,Jul,July

w Minggu dalam satu tahun Angka 27

W Minggu dalam satu bulan Angka 3

D Hari dalam satu tahun Angka 259

d Hari dalam satu bulan Angka 23

F Minggu dalam satu bulan Angka 4

E Hari dalam satu minggu Teks Tuesday, Tue

a Penanda AM/PM Teks AM, PM

H Jam dalam satuan 24 jam (0-23) Angka 10

k Jam dalam satuan 24 jam (1-24) Angka 24

K Jam dalam satuan 12 jam (0-11) Angka 11

h Jam dalam satuan 12 jam (1-12) Angka 12

m Menit Angka 30

s Detik dalam satu menit Angka 36

S Milidetik Angka 178

z Daerah waktu (timezone) Tanda daerah waktu PST, GMT+7, Pacifc Standard Time Z Daerah waktu (timezone) Daerah waktu berdasar

RFC-822

+0800, -0100

Format tanggal dan waktu Hasil "dd/MM/yyyy" 21/03/2004 "dd/MM/yyyy HH:mm:ss" 21/03/2004 23:01:19 "dd.MM.yyyy HH:mm:ss z" 21.03.2004 23:01:19 SGT "dd MMM yyyy" 01 Jan 09 "dd MMMM yyyy" 24 February 2010 "dd MMM yyyy hh:mm:ss a z" 23 Mar 2010 11:09:27 PM SGT

Contoh kodenya bisa kita lihat di bawah ini : import java.util.Date;

import java.text.SimpleDateFormat; import java.text.ParseException; public class SimpleDateFormatTest {

public static void main(String[] args) { Date now = new Date();

System.out.println(new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(now)); String tanggal = "21/12/1990 08:09:10";

try {

Date date = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").parse(tanggal); System.out.println(new SimpleDateFormat("dd MMMM yyyy").format(date)); } catch(ParseException ex) {

ex.printStackTrace(); }

} }

Hasil eksekusinya adalah seperti berikut : $ javac SimpleDateFormatTest.java $ java SimpleDateFormatTest 16/02/2011 01:32:26

21 December 1990 $

Manipulasi tanggal menggunakan Calendar dan memformat tanggal menggunakan SimpleDateFormat terkadang memerlukan kode yang cukup panjang dan tidak praktis. Masalah kurang handalnya library pengolahan tanggal yang ada dalam JDK sudah banyak diketahui, di JDK 7 nanti akan ada library tanggal yang baru di JSR-310. library ini diturunkan dari library tanggal yang sangat populer dan powerfull, yaitu Joda Time. Di bab berikutnya kita akan membandingkan bagaimana mengolah data menggunakan Calendar vs menggunakan Joda Time.

Dalam dokumen c2ed0 java desktop ifnu bima (Halaman 89-94)