JavaRush /Java Blog /Random-ID /Metode default di antarmuka

Metode default di antarmuka

Dipublikasikan di grup Random-ID
Setiap versi baru Java berbeda dari versi sebelumnya. Berikut contoh perubahan dari materi yang kami bahas: Sebelum Java 5, tidak ada enum's dalam bahasa tersebut.
Metode default di antarmuka - 1
Demikian pula, Java 8 sangat berbeda dari Java 7. Sebagian besar kuliah kami ditulis dalam bahasa versi ke-7, namun, tentu saja, kami tidak akan mengabaikan inovasi penting. Karena kita berbicara tentang antarmuka dalam kuliah ini, mari kita lihat satu pembaruan - metode default di antarmuka . Anda sudah tahu bahwa antarmuka tidak dapat diimplementasikan . Tugasnya adalah mendeskripsikan perilaku apa yang seharusnya dimiliki oleh semua objek yang mengimplementasikannya . Namun sering kali pengembang menghadapi situasi di mana penerapan suatu metode di semua kelas adalah sama. Mari kita lihat 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("Газ!");
   }

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


public class Truck implements Car {

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

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}


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

   @Override
   public void brake() {
       System.out.println("Тормоз!");
   }
}
Menurut Anda apa masalah utama dengan kode ini? Anda mungkin memperhatikan bahwa kami menulis banyak kode yang sama! Masalah ini umum terjadi dalam pemrograman dan harus dihindari. Hal lainnya adalah sebelum rilis Java 8 tidak ada opsi solusi khusus. Ketika versi ini keluar, dimungkinkan untuk menentukan metode default dan mengimplementasikannya langsung di dalam antarmuka! Begini cara melakukannya:
public interface Car {

   public default void gas() {
       System.out.println("Газ!");
   }

   public default void brake() {
       System.out.println("Тормоз!");
   }
}

public class Sedan implements Car {

}

public class Truck implements Car {

}

public class F1Car implements Car {

}
Sekarang metode gas()dan brake(), yang sama untuk semua mesin, disertakan dalam antarmuka, dan kode duplikat tidak diperlukan. Selain itu, 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 suatu metode gas(), tetapi hanya 99 yang memiliki perilaku yang sama? Ini merusak segalanya, dan metode default tidak akan berfungsi dalam kasus ini? Tentu saja tidak :) Metode antarmuka default dapat ditimpa.
public class UnusualCar implements Car {
   @Override
   public void gas() {
       System.out.println("Эта машина газует по-другому!");
   }

   @Override
   public void brake() {
       System.out.println("Эта машина тормозит по-другому!");
   }
}
Semua 99 jenis mesin lainnya akan mengimplementasikan metode default, dan kelas UnusualCar- pengecualian - tidak akan merusak gambaran keseluruhan dan dengan tenang akan menentukan perilakunya. Warisan Berganda di Antarmuka Seperti yang telah Anda ketahui, tidak ada warisan berganda di Java. Ada banyak alasan untuk hal ini; kita akan membahasnya secara rinci dalam kuliah terpisah. Dalam bahasa lain, misalnya C++, yang terjadi adalah sebaliknya. Tanpa pewarisan berganda, masalah serius akan muncul: objek yang sama dapat memiliki sejumlah karakteristik dan “perilaku” yang berbeda. Contoh kehidupan: bagi orang tua kita adalah anak-anak, bagi guru kita adalah murid, bagi dokter kita adalah pasien. Dalam kehidupan, kita tampil dalam peran yang berbeda dan, karenanya, berperilaku berbeda: kita jelas akan berbicara dengan guru secara berbeda dibandingkan dengan teman dekat. Mari kita coba menerjemahkan situasi ini ke dalam kode. Bayangkan kita mempunyai dua kelas: Pond dan Aviary. Untuk kolam Anda membutuhkan burung yang bisa berenang, dan untuk kandang burung Anda membutuhkan burung yang bisa terbang. Untuk melakukan ini, kami membuat dua kelas dasar - FlyingBirddan Waterfowl.
public class Waterfowl {
}

public class FlyingBird {
}
Oleh karena itu, kami akan mengirimkan ke kandang burung burung-burung yang kelasnya diwarisi dari FlyingBird, dan ke kolam - burung-burung yang merupakan keturunan Waterfowl. Segalanya tampak sederhana. Namun apa yang akan kita lakukan jika kita perlu mengidentifikasi bebek tersebut di suatu tempat? Dia berenang dan terbang. Tapi kami tidak memiliki banyak warisan. Untungnya, Java menyediakan banyak implementasi antarmuka. Jika suatu kelas tidak dapat mewarisi dari beberapa induk, mengimplementasikan beberapa antarmuka sangatlah mudah! Bebek kita bisa terbang dan berenang :) Cukup menggunakan antarmuka FlyingBirddaripada Waterfowlkelas untuk mencapai hasil yang diinginkan.
public class Duck implements FlyingBird, Waterfowl {

   //методы обоих интерфейсов легко объединяются в одном классе

   @Override
   public void fly() {
       System.out.println("Летим!");
   }

   @Override
   public void swim() {

       System.out.println("Плывем!");
   }
}
Berkat ini, program kami mempertahankan manajemen kelas yang fleksibel, dan dikombinasikan dengan penerapan metode default, kemampuan kami untuk menentukan perilaku objek menjadi hampir tidak terbatas! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION