Monday, March 26, 2018

9. Paket dan Antarmuka Bagian Satu




Bab ini akan menyajikan dua fitur paling inovatif dalam Java: paket dan antarmuka. Paket merupakan pemuat untuk kelas-kelas. Paket dipakai untuk melokalisasi ruang nama kelas. Sebagai contoh, sebuah paket dapat Anda pakai untuk menciptakan sebuah kelas dengan nama List, dimana Anda bisa menyimpannya di dalam paket Anda sendiri tanpa khawatir bila nama kelas itu berbenturan dengan kelas lain bernama List yang disimpan di tempat lain. Paket disimpan dengan cara hierarkis dan secara eksplisit diimpor ke dalam definisi kelas baru.

Pada bab-bab terdahulu, Anda telah melihat bagaimana metode mendefinisikan antarmuka ke data pada sebuah kelas. Melalui penggunaan katakunci interface, Java memampukan Anda untuk mengabstraksi antarmuka dari implementasinya. Dengan menggunakan interface, Anda dapat menciptakan sejumlah metode yang dapat diimplementasikan oleh satu atau lebih kelas. Pada bentuk tradisionalnya, interface itu sendiri tidak mendefinisikan implementasi apapun. Meskipun mirip dengan kelas abstrak, antarmuka memiliki kapabilitas tambahan. Sebuah kelas dapat mengimplementasikan satu atau lebih antarmuka. Sebaliknya, sebuah kelas hanya diperbolehkan mewarisi satu superkelas (abstrak atau konkrit).


Paket
Pada bab-bab sebelumnya, nama dari tiap kelas contoh diambil dari ruang nama yang sama. Ini berarti bahwa nama unik harus diciptakan untuk tiap kelas untuk menghindari benturan nama. Pada gilirannya, tanpa menggunakan pengelolaan ruang nama, Anda akan kehabisan diksi untuk menciptakan nama-nama deskriptif untuk setiap kelas yang Anda ciptakan. Anda juga memerlukan cara untuk memastikan bahwa nama yang Anda pilih untuk sebuah kelas selalu unik dan masuk akal dan tidak berbenturan dengan nama kelas yang dipilih oleh programmer lain. Untunglah, Java menyediakan sebuah mekanisme untuk mempartisi ruang nama kelas ke dalam grup-grup yang mudah untuk dikelola. Mekanisme ini disebut dengan paket. Paket merupakan mekanisme penamaan dan pengendalian visibilitas. Anda dapat mendefinisikan kelas-kelas di dalam sebuah paket yang tidak bisa diakses oleh kode di luar paket. Anda bisa pula mendefinisikan anggota-anggota kelas yang dapat diakses hanya oleh anggota-anggota lain pada paket yang sama.


Mendefinisikan Paket
Untuk menciptakan sebuah paket adalah pekerjaan mudah: Anda hanya perlu mencantumkan katakunci package sebagai statemen pertama pada sebuah kode sumber Java. Semua kelas yang dideklarasikan di dalam file itu akan berada di dalam paket yang ditetapkan. Statemen package mendefinisikan sebuah ruang nama dimana di dalamnya kelas-kelas akan disimpan. Jika Anda mengabaikan statemen package, nama-nama kelas akan ditempatkan ke dalam paket default, yang tidak memiliki nama. Memang paket default cukup untuk program-program pendek, tetap itu tidak cukup untuk aplikasi riil. 

Berikut adalah bentuk umum dari statemen package:

package paket;

Di sini, paket adalah nama dari paket. Sebagai contoh, statemen berikut menciptakan sebuah paket dengan nama PaketKu:

package PaketKu;

Java menggunakan direktori sistem file untuk menyimpan paket. Misalnya, file-file .class untuk kelas yang Anda definisikan sebagai bagian dari PaketKu harus disimpan ke dalam sebuah direktori bernama PaketKu. Ingat bahwa ini merupakan hal yang sangat penting dan nama direktori harus sama dengan nama paket.

Lebih dari satu file dapat dimuat pada statemen package yang sama. Statemen package hanya menetapkan ke dalam paket mana kelas-kelas yang didefinisikan di dalam sebuah file ditempatkan. Kelas-kelas lain yang memuat kelas-kelas lain menjadi bagian dari paket yang sama.

Anda bisa menciptakan sebuah hierarki paket. Untuk melakukannya, Anda hanya perlu memisahkan setiap nama paket dengan operator dot. Bentuk umum dari sebuah statemen paket multilevel ditunjukkan di sini:

package paket1[.paket2][.paket3];

Sebuah hierarki paket harus merefleksikan sistem file pada sistem Java Anda. Sebagai contoh, sebuah paket yang dideklarasikan dengan

package java.awt.image;

harus disimpan ke dalam java/awt/image pada sistem Windows. Pastikan untuk memilih nama paket dengan hati-hati. Anda tida bisa menamai ulang sebuah paket tanpa menamai ulang direktori dimana kelas-kelas disimpan.


Contoh Paket Sederhana
Perhatikan contoh berikut. Anda bisa mencoba paket sederhana ini:

// Sebuah paket sederhana
package PaketKu;

class Saldo {
   String nama;
   double sal;

   Saldo(String n, double b) {
      nama = n;
      sal = b;
   }

   void tampil() {
      if(sal<0)
         System.out.print("--> ");
         System.out.println(nama + ": Rp. " + sal);
   }
}

public class SaldoAkun {
   public static void main(String args[]) {
      Saldo skrg[] = new Saldo[3];
   
      skrg[0] = new Saldo("John Kristof", 1234567.23);
      skrg[1] = new Saldo("Robert Sianipar", 876543.02);
      skrg[2] = new Saldo("Rico Chandra", -108232.33);
  
      for(int i=0; i<3; i++) skrg[i].tampil();
 }
}

Jika dijalankan, program tersebut menghasilkan keluaran:

John Kristof: Rp. 1234567.23
Robert Sianipar: Rp. 876543.02
--> Rico Chandra: Rp. -108232.33

Namakan file ini dengan SaldoAkun.java dan tempatkan pada sebuah direktori dengan nama PaketKu. Selanjutnya, lakukan kompilasi terhadap file ini. Pastikan bahwa file .class yang dihasilkan juga berada di dalam direktori PaketKu. Kemudian, coba eksekusi kelas SaldoAkun, menggunakan perintah baris berikut:

java PaketKu.SaldoAkun


Proteksi Akses
Pada bab-bab terdahulu, Anda belajar tentang sejumlah aspek dari mekanisme kendali akses dan beberapa pemodifikasi akses dalam Java. Misalnya, Anda telah mengetahui bahwa akses terhadap anggota private dari sebuah kelas hanya diberikan kepada anggota-angota lain pada kelas yang sama. Paket menambah dimensi lain pada kendali akses. Seperti yang akan Anda lihat, Java menyediakan banyak level proteksi untuk mengendalikan visibilitas variabel dan metode di dalam kelas, subkelas, dan paket.

Kelas dan paket keduanya merupakan cara dalam mengenkapsulasi dan memuat ruang nama dan skop dari variabel dan metode. Paket berperan sebagai container atau pemuat untuk kelas-kelas. Kelas berperan sebagai pemuat untuk data dank ode. Kelas merupakan unit abstraksi terkecil dalam Java. Berikut adalah empat kategori visibilitas untuk anggota-anggota kelas dalam Java:

  • Subkelas pada paket yang sama
  • Tak subkelas pada paket yang sama
  • Subkelas pada paket berbeda
  • Kelas yang tidak pada paket yang sama dan tidak subkelas

Ketiga pemodifikasi akses private, public, dan protected menyediakan sejumlah cara untuk menghasilkan banyak level akses yang diperlukan pada keempat kategori di atas. Tabel di bawah ini menyimpulkan interaksi-interaksi ini.


Private
Tanpa Pemodifikasi
Protected
Public
Kelas yang sama
Ya
Ya
Ya
Ya
Subkelas pada paket yang sama
Tidak
Ya
Ya
Ya
Tak subkelas pada paket yang sama
Tidak
Ya
Ya
Ya
Subkelas pada paket yang berbeda
Tidak
Tidak
Ya
Ya
Tak subkelas pada paket yang berbeda
Tidak
Tidak
Tidak
Ya

Mekanisme kendali akses pada Java tampak cukup rumit, Anda bisa menyederhanakannya seperti berikut. Semua yang dideklarasikan public dapat diakses dari mana saja. Semua yang dideklarasikan private tidak dapat diakses dari luar kelasnya. Ketika sebuah anggota tidak memiliki spesifikasi akses eksplisit (tanpa pemodifikasi akses), maka anggota itu hanya dapat diakses objek subkelasnya atau oleh kelas lain pada paket yang sama. Ini merupakan akses default. Jika Anda menginginkan sebuah elemen dapat diakses pada paket yang sama tetapi hanya bisa diakses oleh sub-subkelasnya secara langsung, maka elemen tersebut dideklarasikan protected.


Contoh Kendali Akses
Contoh berikut menunjukkan semua kombinasi dari pemodifikasi kendali akses. Contoh ini memiliki dua paket dan lima kelas. Ingat bahwa kelas-kelas tersebut yang berada di dua paket berbeda perlu disimpan pada direktori-direktori sesuai dengan nama paketnya, pada kasus ini, p1 dan p2.

Kode sumber untuk paket pertama mendefinisikan tiga kelas: Proteksi, Terderivasi, dan PaketSama. Kelas pertama mendefinisikan empat variabel int pada tiap mode proteksinya. Variabel n dideklarasikan dengan proteksi default, n_pri dideklarasikan private, n_pro dideklarasikan protected, dan n_pub dideklarasikan public.

Setiap kelas pada contoh ini akan mencoba mengakses variabel-variabel pada setiap objek dari kelas ini. Baris-baris yang tidak bisa dikompilasi karena pembatasan akses akan dijadikan komentar.

Kelas kedua, Terderivasi, adalah subkelas dari Proteksi pada paket yang sama, p1. Ini akan memberikan hak kepada Terderivasi untuk mengakses setiap variabel pada Proteksi kecuali n_pri yang dideklarasikan private. Kelas ketiga, PaketSama, bukan subkelas dari Proteksi, tetapi berada pada paket yang sama, p1. Ini akan memberikan hak kepada PaketSama untuk mengakses setiap variabel pada Proteksi kecuali n_pri yang dideklarasikan private.

Berikut adalah kode sumber untuk Proteksi.java:

package p1;

public class Proteksi {
   int n = 1;
   private int n_pri = 2;
   protected int n_pro = 3;
   public int n_pub = 4;
 
   public Proteksi() {
      System.out.println("Konstruktor superkelas");
      System.out.println("n = " + n);
      System.out.println("n_pri = " + n_pri);
      System.out.println("n_pro = " + n_pro);
      System.out.println("n_pub = " + n_pub);
   }
}

Berikut adalah kode sumber untuk Terderivasi.java:

package p1;

public class Terderivasi extends Proteksi {
   Terderivasi() {
      System.out.println("Konstruktor terderivasi");
      System.out.println("n = " + n);
  
      // hanya kelas yang sama
      // System.out.println("n_pri = "4 + n_pri);
  
      System.out.println("n_pro = " + n_pro);
      System.out.println("n_pub = " + n_pub);
   }
}

Berikut adalah kode sumber untuk PaketSama.java:

package p1;

public class PaketSama {
   PaketSama() {
      Proteksi p = new Proteksi();
  
      System.out.println("Konstruktor paket sama");
      System.out.println("n = " + p.n);
  
      // hanya kelas yang sama
      // System.out.println("n_pri = " + p.n_pri);
  
      System.out.println("n_pro = " + p.n_pro);
      System.out.println("n_pub = " + p.n_pub);
   }
}

Berikut merupakan kode sumber untuk paket lain, p2. Dua kelas yang didefinisikan pada p2 merangkum dua kondisi lain yang dipengaruhi oleh akses kendali. Kelas pertama, Proteksi2, merupakan subkelas dari p1.Proteksi. Ini akan memberikan akses terhadap semua variabel p1.Proteksi kecuali untuk n_pri karena dideklarasikan private dan kecuali untuk n, variabel yang dideklarasikan proteksi default. Ingat, pemodifikasi default hanya memberikan akses dari dalam kelas atau paket yang sama, bukan dari paket yang berbeda. Terakhir, kelas PaketLain hanya memiliki akses terhadap satu variabel, n_pub, yang dideklarasikan public.

Ini adalah kode sumber untuk Proteksi2.java:

package p2;

public class Proteksi2 extends p1.Proteksi {
   Proteksi2() {
      System.out.println("Konstruktor terderivasi paket lain");
  
      // hanya kelas atau paket yang sama
      // System.out.println("n = " + n);
  
      // hanya kelas yang sama
      // System.out.println("n_pri = " + n_pri);
  
      System.out.println("n_pro = " + n_pro);
      System.out.println("n_pub = " + n_pub);
   }
}

Ini adalah kode sumber untuk PaketLain.java:

Ini adalah kode sumber untuk PaketLain.java:

package p2;

public class PaketLain {
   PaketLain() {
      p1.Proteksi p = new p1.Proteksi();
      System.out.println("Konstruktor paket lain");
  
      // hanya kelas atau paket yang sama
      // System.out.println("n = " + p.n);
  
      // hanya kelas yang sama
      // System.out.println("n_pri = " + p.n_pri);
  
      // hanya subkelas, kelas, dan paket yang sama
      // System.out.println("n_pro = " + p.n_pro);
  
      System.out.println("n_pub = " + p.n_pub);
   }
}

Jika Anda ingin mencoba kedua paket ini, berikut adalah dua file uji yang dapat Anda gunakan. Satu untuk menguji paket p1 ditunjukkan di sini:

// Demo paket p1
package p1;

// Menginstansiasi sejumlah kelas pada p1
public class Demo {
   public static void main(String args[]) {
      Proteksi ob1 = new Proteksi();
      Terderivasi ob2 = new Terderivasi();
      PaketSama ob3 = new PaketSama();
   }
}

Jika dijalankan, program ini menghasilkan keluaran berikut:

Konstruktor superkelas
n = 1
n_pri = 2
n_pro = 3
n_pub = 4
Konstruktor superkelas
n = 1
n_pri = 2
n_pro = 3
n_pub = 4
Konstruktor terderivasi
n = 1
n_pro = 3
n_pub = 4
Konstruktor superkelas
n = 1
n_pri = 2
n_pro = 3
n_pub = 4
Konstruktor paket sama
n = 1
n_pro = 3
n_pub = 4

Berikut adalah file uji untuk paket p2:

// Menguji paket p2
package p2;

//Menginstansiasi sejumlah kelas pada p2
public class Demo {
   public static void main(String args[]) {
      Proteksi2 ob1 = new Proteksi2();
      PaketLain ob2 = new PaketLain();
   }
}

Jika dijalankan, program ini menghasilkan keluaran berikut:

Konstruktor superkelas
n = 1
n_pri = 2
n_pro = 3
n_pub = 4
Konstruktor terderivasi paket lain
n_pro = 3
n_pub = 4
Konstruktor superkelas
n = 1
n_pri = 2
n_pro = 3
n_pub = 4
Konstruktor paket lain
n_pub = 4


Selanjutnya  >>>

No comments: