Java Efektif Oleh Joshua Bloch: Item1 - Metode Pabrik Statis

Saya membaca Effective Java oleh Joshua Bloch dan saya memiliki pertanyaan tentang Item1 Static Factory Method.

Kutipan[Bloch, hal.7]

Antarmuka tidak boleh memiliki metode statis, jadi berdasarkan konvensi, metode pabrik statis untuk antarmuka bernama Type diletakkan di kelas non-instantiable bernama Types. Misalnya Java Collections Framework, menyediakan koleksi yang tidak dapat dimodifikasi, koleksi tersinkronisasi, dan sejenisnya. Hampir semua implementasi ini diekspor melalui metode pabrik statis dalam satu kelas noninstantiable (java.util.Collections). Kelas dari objek yang dikembalikan semuanya non-publik.

Oke. Saat melihat kode sumber, saya melihat antarmuka java.util.Collection dan kelas java.util.Collections dengan konstruktor pribadi (kelas non-instantiable). dan saya melihat bahwa kelas non-instantiable Collections memiliki semua metode statis, seperti yang dikatakan Bloch. Tapi saya gagal melihat hubungan antara kedua kelas seperti yang dikatakan Bloch

Antarmuka tidak boleh memiliki metode statis, jadi berdasarkan konvensi, metode pabrik statis untuk antarmuka bernama Type diletakkan di kelas non-instantiable bernama Types.

  1. Adakah yang bisa menunjukkan hal yang sudah jelas bagi saya?

  2. apa maksudnya saat dia berkata

Kelas objek yang dikembalikan semuanya non-publik

Di sinilah saya mendapatkan sumber Java: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collection.java?av=f


person Thang Pham    schedule 25.05.2011    source sumber
comment
Lihat juga Bloch, Item 1.   -  person trashgod    schedule 26.05.2011
comment
segala sesuatu tentang Bloch merupakan nilai tambah bagi saya, secara default.   -  person Thufir    schedule 01.09.2013


Jawaban (5)


  1. Antarmuka tidak boleh memiliki metode statis, jadi berdasarkan konvensi, metode pabrik statis untuk antarmuka bernama Type diletakkan di kelas non-instantiable bernama Types.

    Intinya hanyalah jamak 's' pada "Type[s]". Jadi jika antarmuka Anda disebut Foo dan Anda ingin membuat beberapa implementasi yang disebut MyFoo maka pabrik Anda dengan metode untuk membuat instance harus dipanggil Foos berdasarkan konvensi.

  2. Kelas objek yang dikembalikan semuanya non-publik

    Ini berarti kelas objek yang dikembalikan dari metode pabrik memiliki pengubah visibilitas pribadi atau default seperti pada private class MyFoo{} sehingga objek tersebut tidak dapat dipakai dengan cara lain apa pun selain metode pabriknya. Karena Anda tidak dapat membuat Objek menggunakan operator new dari kelas privat dalam atau paket kelas privat di luar cakupannya (selain refleksi).

e.g.:

 public interface Foo{ //interface without plural 's' (question 1)
     public void bar();
 }
 public abstract class Foos(){ // abstract factory with plural 's' (question 1)
    public static Foo createFoo(){
        return new MyFoo();
    }
    private class MyFoo implements Foo{ // a non visible implementation (question 2)
       public void bar(){}
    }
 }
person fasseg    schedule 25.05.2011
comment
Penjelasan bagus tentang 1. Saya memahaminya pasti lebih baik. Terima kasih banyak. Untuk 2: apa manfaatnya menjadikan objek yang dikembalikan sebagai turunan dari kelas privat? - person Thang Pham; 25.05.2011
comment
Anda dapat mengganti implementasi tanpa disadari oleh pengguna API, karena dia tidak pernah membuat sendiri salah satu objek menggunakan new. Jadi, jika Anda perlu menerapkan ulang sesuatu, Anda dapat membuat rilis baru tanpa perubahan API apa pun - person fasseg; 25.05.2011
comment
Hm, saya merasa perlu menambahkan pengubah 'statis' ke kelas dalam MyFoo agar ini dapat dikompilasi... Kalau tidak, saya mendapatkan kesalahan bahwa tidak ada contoh Foos yang terlampir. Apakah saya melakukan sesuatu yang salah? - person Mats_SX; 20.01.2014
comment
@Mats_SX: Saya baru saja membaca sesuatu tentang itu. javarevisited.blogspot.sg/2012/02/ Intinya adalah bahwa di kelas MyFoo bagian dalam, Anda telah membuat instance Foos dan mereferensikannya. - person MacD; 09.02.2014
comment
Salah satu contoh yang bagus adalah Lists Kelas dari Guava, yang berisi fungsi pabrik statis untuk List instance. Misalnya, Anda dapat membuat daftar string dengan kode berikut: List<String> list = Lists.newArrayList("first", "second", "third") - person pedromanoel; 13.03.2017

Katakanlah Anda memiliki antarmuka bernama List dan Anda ingin menggunakan metode pabrik statis untuk membuat jenis daftar yang berbeda. Anda tidak dapat menentukan metode pabrik statis di antarmuka List karena ini adalah antarmuka. Jadi yang harus Anda lakukan adalah memiliki kelas yang mengembalikan instance kelas yang mengimplementasikan Daftar

public class ListFactory{
  private ListFactory(){}
  public static List makeArrayList(){...}
  public static List makeLinkedList(){...}
  public static List makeCrazyList(){...}
}

Anda tidak dapat melakukan ini

public interface List{
   public static List makeArrayList();
   public static List makeLinkedList();
   public static List makeCrazyList();
}

Karena List adalah antarmuka.

person Alvin    schedule 25.05.2011
comment
Pada Java 8, batasan bahwa antarmuka tidak dapat memuat metode statis telah dihilangkan. - person Mohdroid; 26.04.2021

Jadi ambil contoh Koleksi.daftar yang tidak dapat dimodifikasi(...). Ini mengembalikan beberapa implementasi Daftar. Namun nama kelas implementasi tidak relevan. Lebih jauh lagi, kelas tersebut hanya dibangun melalui metode pabrik statis.

person Dilum Ranatunga    schedule 25.05.2011

1) Saya tidak mengerti pertanyaan Anda di sini. Collection adalah antarmuka dan Collections memiliki beberapa metode pabrik seperti emptyList

2) Misalnya instance Daftar yang dikembalikan oleh Collection.emptyList adalah turunan dari kelas privat yang mengimplementasikan antarmuka List.

person Kaj    schedule 25.05.2011
comment
Saya punya pertanyaan lain untuk Anda. Untuk 2, apa manfaatnya menjadikan objek yang dikembalikan sebagai turunan dari kelas privat? - person Thang Pham; 25.05.2011

Ini berarti bahwa tipe pengembalian metode pabrik statis di Collections (dan kelas lain yang serupa) adalah tipe antarmuka (misalnya List) daripada kelas implementasi tertentu (misalnya java.util.Collections.UnmodifiableList), yang tidak terlihat oleh pengguna karena itu hanya akan memperumit masalah. dan meningkatkan ukuran API.

person ColinD    schedule 25.05.2011