DEKLARASI PADA PEMROGRAMAN JAVA 8dfs7a
Deklarasi Class
Class di dalam java dideklarasikan menggunakan keyword class diikuti dengan nama class. Setelah nama class ada kurung kurawal buka ({) menandai awal dari class dan kurung kurawal tutup (}) yang menandai akhir dari class. Object adalah instansiasi dari class. Kita bisa membayangkan bahwa class adalah sebuah cetakan dan object adalah materi hasil cetakan dari class. Setiap object akan mempunyai state (instance variabel/properties) yang membedakan satu object dengan object lain, kemudian object juga mempunyai behaviour (method) dimana logic dari class disimpan. Class adalah jantungnya Java, class adalah bagian terkecil dari kode di java yang bisa berdiri sendiri. Setiap kali kita akan membuat sebuah kode java, yang pertama harus dideklarasikan adalah class. Java mengijinkan class didefnisikan dalam beberapa cara berbeda. Cara pertama adalah mendefnisikan sebuah public class di dalam fle .java. Contohnya bisa kita lihat di bawah ini :
public class Person { }
Simpan di dalam fle Person.java, kemudian compile fle .java di atas menggunakan java compiler (javac). $ javac Person.java
Setelah proses kompilasi berhasil, lihat isi folder dengan menggunakan perintah dir (windows) atau ls (*nix). Terlihat bahwa class Person dibuatkan satu buah fle .class, dan nama dari fle .class-nya sama persis dengan nama class-nya.
Kode di atas adalah deklarasi minimal dari sebuah class Java, ada keyword class diikuti oleh nama class-nya kemudian diikuti oleh kurung kurawal buka dan tutup.
Cara kedua adalah beberapa class dideklarasikan di dalam satu fle .java, tetapi dalam satu fle .java hanya boleh dideklarasikan satu buah public class yang namanya sama dengan nama fle .java. Contohnya sebagai berikut :
public class Person{}
class Person2{}
class Person3{}
class Person4{}
Simpan di dalam fle Person.java, kemudian compile fle .java di atas menggunakan java compiler
(javac).
$ javac Person.java
Setelah proses kompilasi berhasil, lihat isi folder dengan menggunakan perintah dir (windows) atau ls (*nix). Terlihat bahwa setiap class dibuatkan satu buah fle .class, dan nama dari fle .classnya sama persis dengan nama class-nya.
Person.class
Person2.class
Person3.class
Person4.class
Cara ketiga adalah mendeklarasikan class sebagai inner class. Bisa kita lihat bahwa cara kedua di atas, deklarasi class kedua dan seterusnya berada di luar dari class pertama, kemudian fle .class yang dihasilkan berbeda-beda, dan penamaan class-nya tidak menyertakan nama class public-nya, semuanya adalah class berbeda tetapi diletakkan dalam fle yang sama. Konsep inner class berbeda, karena sekarang class yang dideklarasikan di dalam class lain (inner class). Inner class sangat terikat dengan class dimana inner class itu berada. Misalnya dari sisi penamaan, nama inner class harus diawali dengan nama class dimana inner class
berada kemudian diikuti dengan nama inner class itu sendiri. Misalnya contoh di bawah ini :
public class Person{
private class Person2{}
private static class Person3{}
class Person4{}
}
Compile fle .java di atas menggunakan java compiler (javac).
$ javac Person.java
Setelah proses kompilasi berhasil, lihat isi folder dengan menggunakan perintah dir (windows)
atau ls (*nix). Terlihata bahwa setiap class dibuatkan satu buah fle .class, nama fle .class
untuk inner class diawali dengan nama class di mana inner class berada kemudian ada tanda $
dan diakhiri dengan nama innner class-nya.
Person.class
Person$Person2.class
Person$Person3.class
Person$Person4.class
Cara deklarasi terakhir adalah anonymous inner class, yaitu inner class yang tidak mempunyai
nama, loh kok bisa? feature ini sering digunakan kalau kita ingin mengimplementasikan
interface di satu tempat dan implementasi itu tidak pernah digunakan di tempat lain.
Contohnya sebagai berikut ini :
public class Person{
private Runnable thread = new Runnable(){
public void run(){
System.out.println("HelloWorld from Thread");
}
};
}
Perhatikan kode di atas, ada sebuah variabel dengan nama thread, variabel tersebut adalah object dari class Runnable. Karena Runnable adalah interface, maka kita perlu membuat class yang implement interface, tetapi implementasinya tidak perlu membuat class baru dengan nama tertentu, cukup langsung new Runnable dan implementasikan method run langsung di situ. Simpan ke fle Person.java dan coba compile menggunakan javac, setelah kompilasi berhasil lihat isi dari direktori, akan ada dua buah fle class yaitu Person.class dan Person$1.class, nah class yang terakhir inilah anonymous inner class. Kalau ada dua inner class atau lebih, penamaanya menjadi Person$2.class, Person$3.class dan seterusnya. Setelah kita membahas cara deklarasi java, sekarang kita bahas aturan-aturan yang harus dipatuhi pada waktu pendeklarasian class di Java. Aturan-aturan tersebut antara lain :
Hanya boleh ada satu class public dalam satu fle .java, non public class boleh lebih dari satu di dalam satu fle .java
Nama class public harus sama dengan nama fle .java Komentar bisa diletakkan di mana saja Jika class berada dalam sebuah package, maka harus ada deklarasi package di bagian paling atas dari fle .java
Import berada antara deklarasi package dan deklarasi class
Deklarasi import dan package berlaku untuk semua class dalam fle .java, tidak mungkin mendefnisikan dua buah class yang mempunyai package berbeda di dalam satu fle .java
Dalam aturan di atas, ada poin yang menyebutkan tentang package. Package adalah feature yang sangat penting dalam Java, pada dasarnya package adalah sebuah folder yang memisah-misahkan class. Class dengan fungsi yang mirip akan dikelompokkan dalam satu package yang sama, hal ini dimaksudkan untuk memudahkan pengelolaan class agar mudah dipahami. Kita bisa meletakkan beberapa keyword pada waktu pendeklarasian class. Jenis keyword pertama yang bisa digunakan adalah access modifer, keyword access modifer terdiri dari empat level : public, default, protected dan private. Hanya tiga dari empat level tersebut yang benar-benar merupakan keyword, access modifer default bukan merupakan keyword karena kalau tidak ada satupun dari ketiga access modifer digunakan di dalam deklarasi class maka kita menyebutnya default. Kita akan bahas satu per satu efek dari penggunaan access modifer pada deklarasi sebuah class. Jika sebuah class dideklarasikan sebagai public, maka semua class yang lain dapat melihat class tersebut. Melihat di sini dalam arti bisa mengimport, menginstansiasi, mengextends dan memanggil method yang ada dalam class. Jika sebuah class dideklarasikan sebagai default atau tidak ada access modifer sama sekali, maka hanya class dari package yang sama atau class turunanya yang dapat melihat class tersebut. Class tidak bisa dideklarasikan sebagai protected. Private hanya bisa digunakan oleh inner class saja, sedangkan class lain tidak bisa ditandai sebagai private. Selain access modifer, class bisa dideklarasikan menggunakan keyword fnal. Jika class dideklarasikan dengan keyword fnal maka class ini tidak bisa diextends oleh class lain, salah satu alasan kenapa class ditandai fnal agar tidak ada implementasi lain selain class ini. Semua class wrapper seperti String ditandai sebagai fnal agar tidak ada yang mengextends class String ini. Keyword abstract bisa digunakan untuk mendeklarasikan class, hal ini akan menyebabkan abstract class tidak dapat diinstansiasi atau dibuat objectnya. Deklarasi Interface Interface pada dasarnya adalah sebuah class, hanya saja method-method di dalamnya hanya berupa deklarasi saja, tidak ada implementasi dari method-method tersebut. Secara teknis bisa dikatakan bahwa interface adalah class yang bersifat abstract, semua methodnya adalah public dan abstract, serta semua variabel yang ada dalam interface adalah static fnal atau biasa disebut sebagai konstanta. Deklarasi interface menggunakan keyword interface diikuti dengan nama interface. Contoh paling sederhana dari sebuah interface bisa kita lihat dalam kode di bawah ini:
interface PersonDao{}
Aturan penamaan interface sama dengan penamaan class, kemudian aturan pendeklarasian interface juga sama dengan pendeklarasian interface. Hanya saja tidak ada istilah inner interface layaknya inner class.
Sebagai contoh kita akan membuat class PersonDaoImpl yang mengimplementasikan interface PersonDao, di dalam interface PersonDao ada tiga buah method: save, delete dan getById sehingga class PersonDaoImpl harus mengimplementasikan ketiga method ini.
public class Person{
private Long id;
private String nama;
public String getNama(){
return nama;
}
public void setNama(String nm){
nama = nm;
}
public Long getId(){
return id;
}
public void setId(Long i){
id = i;
}
}
Interface dideklarasikan dengan menggunakan keyword interface. Di dalamnya ada methodmethod
yang
dideklarasikan
tetapi
belum
ada
implementasinya,
ditandain
dengan
adanya
titik
koma
(;) setelah deklarasi method. Kalau method sudah diimplementasikan maka setelah
deklarasi method harus ada pasangan kurung kurawal buka tutup ({}) yang menandai blok
kode yang akan dieksekusi kalau method tersebut dipanggil.
public interface PersonDao{
void save(Person p);
void delete(Person p);
Person getById(Long id);
}
Class mengimplementasikan interface dengan menggunakan keyword implements. Semua
method dalam interface bersifat public sehingga walaupun dalam deklarasi interface tidak ada
public tetapi di class yang mengimplementasikan interface harus meletakkan access identifers
public pada deklarasi methodnya.
public class PersonDaoImpl implements PersonDao{
public void save(Person p){
System.out.println("menyimpan Person");
}
public void delete(Person p){
System.out.println("menghapus person");
}
public Person getById(Long id){
Person p = new Person();
p.setId(id);
p.setNama("abc");
return p;
}
}
Sebuah class bisa mengimplementasikan lebih dari satu interface, antara satu interface dengan interface yang lain dipisahkan dengan tanda koma, seperti contoh sederhana di bawah ini :
public interface PersonDaoImpl implements PersonDao, Serializable{} Interface biasanya digunakan sebagai "kontrak" agar sebuah class yang mengimplementasikan interface mempunyai semua method yang ada dalam interface itu, tetapi kita tidak ingin mengekspose implementasinya. Salah satu contoh penggunaan interface adalah JDBC API. Di dalam JDBC API terdapat banyak interface seperti Connection, ResultSet, Statement, PreparedStatement dan seterusnya. Setiap database yang ingin bisa diakses dari Java akan mengimplementasikan JDBC API ini dengan cara membuat class yang mengimplementasikan semua interface dalam JDBC API. Sehingga kalau kita ingin melakukan koneksi ke MySQL ataupun ke Oracle, interfacenya sama, yang berbeda hanya implementasinya saja. implementasi dari JDBC API ini sering dikenal sebagai JDBC Driver. Mengenai JDBC kan kita bahas lebih lanjut di bagian akses data ke database, sekarang kita fokuskan ke Interface. Interface juga digunakan dalam best practice yang sering disebut dengan "code to interface", best practice ini menganjurkan developer untuk menggunakan interface antar layer dalam aplikasi. Misalnya contoh di atas kita membuat sebuah interface dengan nama PersonDao untuk melakukan operasi penyimpanan object person, dengan membuat interface seperti ini kita bisa mempunyai implementasi berbeda-beda untuk proses penyimpanan object person. Di contoh di atas implementasi PersonDao sangat sederhana hanya menulis string ke stdout, kita juga bisa membuat misalnya PersonDaoJdbc untuk menyimpan object person ke database dengan menggunakan JDBC, atau bisa juga dibuat PersonDaoHibernate untuk menyimpan object person ke database menggunakan Hibernate. Kalau anda masih sulit memahami dua paragraf terakhir tentang interface, tidak masalah.
Class vs Object
Object adalah instansiasi dari sebuah Class. Kalau kita analogikan, class itu sebuah cetakan sedangkan object itu adalah barang dari hasil cetakan. Class juga bisa dikatakan sebagai kategori, sedangkan object adalah sesuatu yang memenuhi syarat-syarat yang harus dipenihi agar masuk dalam kategori tersebut. Jadi bisa dibilang satu class bisa mempunyai banyak object, setiap object mempunyai sifat yang sama persis seperti yang didefnisikan dalam class tersebut. Kita ambil contoh adalah class Person, kemudian kita buat sebuah instance dari class Person yaitu ifnu. Kalimat di atas kalau diwujudkan dalam kode menjadi seperti di bawah ini : Person ifnu = new Person(); Dua kata paling kiri adalah proses deklarasi sebuah object dengan tipe Person, kemudian di sebelah kanan tanda sama dengan (=) terjadi proses instansiasi object dari class Person menggunakan keyword new. Setiap kali kita bertemu keyword new artinya hanya satu, yaitu instansiasi object dari sebuah class. Keyword new secara detail dalam level yang paling bawah, menyebabkan JVM akan membuat object di dalam memory.
Method
Method adalah sekumpulan kode yang diberi nama, untuk merujuk ke sekumpulan kode tersebut digunakan sebuah nama yang disebut dengan nama method. Method mempunyai parameter sebagai input dan nilai kembalian sebagai output. Kita bisa juga membayangkan method itu adalah sebuah mesin, ada input yang dibutuhkan dan output yang dihasilkan. Deklarasai method terdiri dari beberapa bagian, bagian pertama adalah access modifer dari method, apakah public, private, protected atau default. Bagian berikutnya adalah tipe kembalian dari method, kalau method tidak mengembalikan apa-apa maka keyword void yang digunakan. Bagian ketiga adalah nama method, sesuai dengan aturan java code convention, nama method diawali dengan huruf kecil dan setiap kata setelahnya diawali dengan huruf besar (camel case). Setelah nama method ada parameter. Sebuah method bisa juga tidak mempunyai parameter, punya satu, dua dan seterusnya. Setelah java 5 ada feature yang disebut dengan varargs, feature ini memungkinkan method untuk mempunyai jumlah parameter yang bervariasi. Varargs akan kita bahas di bab tentang Java 5 Language enhancement, jadi tidak akan dibahas dalam bab ini. Bagian terakhir dari method adalah deklarasi throws exception, dimana kita bisa mendeklarasikan tipe exception yang akan dithrows oleh method. Bab tentang exception akan membahas lebih lanjut tentang throws exception.
Nama method dan parameter adalah pembeda antara satu method dengan method yang lainya. Kalau dua method namanya beda ya pasti dianggap dua buah method berbeda. Kalau dua method namanya sama dianggap sebagai method yang berbeda kalau parameternya berbeda, method dengan nama sama dan parameter berbeda ini disebut dengan overloading dalam konsep OOP. Kalau method mempunyai nama yang sama dan parameter yang sama tetapi tipe return atau throws exceptionya berbeda maka akan menyebabkan error pada waktu kompilasi. Jadi kalau mendefnisikan method baru, pastikan bahwa namanya tidak sama dengan method lain atau setidaknya parameternya berbeda baik dari sisi jumlahnya, tipe parameter atau posisi parameter. Dari penjelasan di atas, struktur method seperti di bawah ini adalah benar:
public void main(String[] args){ }
public String methodReturnString(){ return "ini string"; }
private void methodBerparameter(String parameter1, Integer parameter2) {}
public void methodThrowsException() throws IOException {}
protected String protectedMethod(Sting parameter1, Integer parameter2)
throws IOException { return "ini string"; }
public void methodBerbeda() {}
public void methodBerbeda(String parameter1) {}
public void methodBerbeda(String parameter1, Integer parameter2) {}
public void methodBerbeda(Integer parameter1, String parameter2) {}
public void methodBerbeda(Double parameter1, Double parameter2) {}
Ada beberapa keyword yang bisa ditambahkan dalam deklarasi method. Keyword yang paling sering digunakan adalah static. Bagian kode Java yang dideklarasikan dengan menggunakan static akan menjadi anggota dari class, bukan anggota dari object, silahkan kembali ke bab berikutnya kalau masih belum bisa membedakan mana class dan mana object. Karena method yang ditandai dengan static adalah bagian dari class, maka bisa diakses langsung dari nama Class itu sendiri, tidak perlu membuat object. Method static hanya bisa memanggil method lain dalam satu class yang juga ditandai static. Method main yang biasa kita gunakan untuk menjalankan aplikasi java juga ditandai dengan static, misalnya kita akan memanggil method lain dari method static, maka method lainya ini juga harus ditandai dengan static. Kita lihat contoh berikutnya :
public class StaticTest {
public static void main(String[] args) {
//static method memanggil static method lain dalam class yang sama
contohMethodStatic();
//method static juga bisa dipanggil dari nama classnya
StaticTest.contohMethodStatic();
}
public static void contohMethodStatic() {
System.out.println("method static dipanggil");
}
}
Kalau kode di atas dicompile, kemudian dijalankan maka hasilnya seperti di bawah ini :
$ javac StaticTest.java
$ java StaticTest
method static dipanggil
method static dipanggil
$
terlihat bahwa method contohMethodStatic dipanggil dua kali, baik menggunakan nama class
maupun tidak.
Keyword lain yang bisa digunakan oleh method adalah fnal, synchronize dan native. Keyword
fnal akan menyebabkan method tidak bisa dioverride, kita bahas topik ini di bab OOP. Keyword
synchronize akan menyebabkan hanya satu thread yang bisa mengeksekusi method ini dalam
satu waktu, kalau ada thread lain maka harus mengantri sampai thread sebelumnya selesai
menjalankan method tersebut. Keyword native menandai implementasi method akan
diletakkan dalam kode native, misalnya ditulis menggunakan C/C++, kemudian menggunakan
Java Native Interface (JNI) untuk mengakses implementasi method tersebut. Topik mengenai
JNI dan native tidak kita bahas di dalam buku ini dan diserahkan kepada anda.
No comments:
Post a Comment