CodeGym /Java Blog /Acak /Metode default di antarmuka
John Squirrels
Level 41
San Francisco

Metode default di antarmuka

Dipublikasikan di grup Acak
Setiap versi baru Java berbeda dari versi sebelumnya. Berikut adalah contoh perubahan materi yang telah kami bahas: sebelum Java 5, bahasa tidak memiliki enums. Metode default di antarmuka - 1Demikian pula, Java 8 sangat berbeda dari Java 7. Sebagian besar pelajaran kami ditulis untuk bahasa versi ke-7, tetapi tentu saja kami tidak akan mengabaikan inovasi penting. Karena kita sudah berbicara tentang antarmuka dalam pelajaran ini, kita akan mempertimbangkan satu pembaruan — metode default di interfaces . Anda sudah tahu bahwa antarmuka tidak mengimplementasikan behavior . Tugasnya adalah untuk mendeskripsikan perilaku yang harus dimiliki oleh semua objek yang mengimplementasikannya. Tetapi pengembang sering menghadapi situasi di mana penerapan metode sama di semua kelas. Mari pertimbangkan contoh mobil lama kita:

public interface Car {

   public void gas();

   public void brake();
}
public class Sedan implements Car {

   @Override
   public void gas() {
       System.out.println("Gas!");
   }

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}


public class Truck implements Car {

   @Override
   public void gas() {
       System.out.println("Gas!");
   }

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}


public class F1Car implements Car {
   @Override
   public void gas() {
       System.out.println("Gas!");
   }

   @Override
   public void brake() {
       System.out.println("Brake!");
   }
}
"Menurut Anda, apa masalah utama dengan kode ini? Anda mungkin memperhatikan bahwa kami menulis banyak kode berulang! Masalah ini biasa terjadi dalam pemrograman, dan Anda harus menghindarinya. Ini masalah lain bahwa solusi khusus tidak ada sebelumnya Java 8 dirilis. Dengan versi ini muncul kemampuan untuk menentukan metode default dan mengimplementasikannya tepat di dalam antarmuka! Inilah cara Anda melakukannya:

public interface Car {

   public default void gas() {
       System.out.println("Gas!");
   }

   public default void brake() {
       System.out.println("Brake!");
   }
}

public class Sedan implements Car {

}

public class Truck implements Car {

}

public class F1Car implements Car {

}
Sekarang metode gas()dan brake(), yang sama untuk semua mobil, telah dipindahkan ke antarmuka. Tidak diperlukan kode berulang. Terlebih lagi, metodenya tersedia di setiap kelas!

public class Main {

   public static void main(String[] args) {

       F1Car f1Car = new F1Car();
       Sedan sedan = new Sedan();
       Truck truck = new Truck();
       truck.gas();
       sedan.gas();
       f1Car.brake();
   }
}
Bagaimana jika ada 100 kelas dengan gas()metode tersebut, tetapi hanya 99 kelas yang memiliki perilaku yang sama? Apakah itu merusak segalanya dan membuat metode default tidak cocok untuk situasi ini? Tentu saja tidak :) Metode default di antarmuka dapat diganti dengan cara yang sama seperti yang biasa.

public class UnusualCar implements Car {
   @Override
   public void gas() {
       System.out.println("This car accelerates differently!");
   }

   @Override
   public void brake() {
       System.out.println("This car decelerates differently!");
   }
}
Semua 99 jenis mobil lainnya akan menerapkan metode default, danUnusualCarkelas, yang merupakan pengecualian, tidak akan merusak gambaran keseluruhan dan dengan tenang menentukan perilakunya sendiri. Warisan berganda dari antarmuka. Seperti yang sudah Anda ketahui, Java tidak mendukung banyak pewarisan. Ada banyak alasan untuk ini. Kami akan melihatnya secara rinci dalam pelajaran terpisah. Bahasa lain, seperti C++, mendukungnya. Tanpa pewarisan berganda, masalah serius muncul: satu objek dapat memiliki beberapa karakteristik dan 'perilaku' yang berbeda. Inilah contoh dari kehidupan: kita adalah anak-anak bagi orang tua kita, siswa bagi guru kita, dan pasien bagi dokter kita. Dalam hidup, kita mengambil peran yang berbeda dan, karenanya, berperilaku berbeda: jelas, kita tidak akan berbicara dengan guru dengan cara yang sama seperti kita berbicara dengan teman dekat kita. Mari kita coba terjemahkan ini ke dalam kode. Bayangkan kita memiliki dua kelas: Tambak dan Aviary. Untuk kolam, kita membutuhkan unggas air; untuk kandang burung, kami membutuhkan burung terbang. Untuk melakukan ini, kami telah membuat dua kelas dasar:FlyingBirddan Waterfowl.

public class Waterfowl {
}

public class FlyingBird {
}
Oleh karena itu, kami akan mengirim burung yang kelasnya diwariskan FlyingBirdke kandang burung, dan kami akan mengirim burung yang mewarisi Waterfowlke kolam. Semuanya tampak sangat sederhana. Tapi kemana kita mengirim bebek? Ia berenang dan terbang. Dan kami tidak memiliki banyak warisan. Untungnya, Java mendukung banyak implementasi antarmuka. Meskipun sebuah kelas tidak dapat mewarisi beberapa induk, ia dapat dengan mudah mengimplementasikan beberapa antarmuka! Bebek kita bisa menjadi burung terbang dan unggas air :) Kita hanya perlu membuat FlyingBirdantarmuka Waterfowldaripada kelas untuk mencapai hasil yang diinginkan.

public class Duck implements FlyingBird, Waterfowl {

   // The methods of both interfaces can be easily combined into one class

   @Override
   public void fly() {
       System.out.println("Fly!");
   }

   @Override
   public void swim() {

       System.out.println("Swim!");
   }
}
Dengan demikian, program kami mempertahankan fleksibilitas kelas, dan, dalam kombinasi dengan metode default, kemampuan kami untuk mendefinisikan perilaku objek menjadi hampir tidak terbatas! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION