2016-07-17 41 views
5

Neden LocalDate, LocalTime, Stream, vb nesneler bir kurucu yerine of() fabrika yöntemini kullanır?Neden LocalDate, LocalTime ve Stream nesneleri bir kurucu yerine bir fabrika yöntemi() kullanır?

newhere yerine neden bir fabrika yönteminin kullanılması gerektiğine dair bir açıklama buldum. Bu cevap nedenlerle bir dizi verir ama Java Tarih/Saat API alakalı tek şey şudur: yapıcıları aksine

, yeni bir nesne onlar çağrılan konum her zaman yaratmak için gerekli değildir

LocalDate gibi

ve LocalTime iletmenin, muhtemelen bir fabrika kullanmak ve yerine yeni bir nesne her zaman yaratma mevcut nesneleri yeniden mantıklı.

LocalDate ve LocalTime gibi nesnelerin fabrika yöntemiyle (yani, LocalDate.of()) oluşturulmasının nedeni bu mu? Başka sebep var mı?

Ayrıca, Stream nesneleri değiştirilebilir. Neden Stream oluşturmak için bir fabrika yöntemi (Stream.of()) kullanılır?

+1

[Programcılar ile ilgili bu soru] 'nun yanıtları da (http://programmers.stackexchange.com/q/322936/187318) ilginç olabilir. – Hulk

cevap

10

Akış oluşturmak için neden bir fabrika yöntemi (Stream.of()) kullanılır?

Bir fabrika yöntemi kullanmak, kullanılan tam sınıfı bilmeniz gerekmediği anlamına gelir. Bu, Stream'un bir arabirim olduğu ve bir arayüz örneğini oluşturamayacağınız için iyi bir örnektir. Stream.of

/** 
* Returns a sequential {@code Stream} containing a single element. 
* 
* @param t the single element 
* @param <T> the type of stream elements 
* @return a singleton sequential stream 
*/ 
public static<T> Stream<T> of(T t) { 
    return StreamSupport.stream(new Streams.StreamBuilderImpl<>(t), false); 
} 

/** 
* Returns a sequential ordered stream whose elements are the specified values. 
* 
* @param <T> the type of stream elements 
* @param values the elements of the new stream 
* @return the new stream 
*/ 
@SafeVarargs 
@SuppressWarnings("varargs") // Creating a stream from an array is safe 
public static<T> Stream<T> of(T... values) { 
    return Arrays.stream(values); 
} 

Not için kaynak itibaren

: bu yöntemler diğer fabrika yöntemleri çağırmak.

Nasıl çağrıldığına bağlı olarak farklı yapılar görebiliyorsunuz. Bunu bilmenize gerek yoktur ya da nihai sınıfın yarattığı nihai sınıf olan ReferencePipeline.Head

+1

Teşekkürler! Bu cevabı en çok kabul gören kişi olarak kabul ettim, ama Andy Turner'ın cevabı sorumun ikinci kısmına cevap verdi. – Alex

7

+ 1'in Peter'ın yanıtı.

Fabrika yöntemlerini kullanmanın bir başka nedeni, "adlandırılmış yapıcılar" gibi davranmalarıdır.Örneğin

, LocalDate (en azından, burada ayrıntılı olmayabilir) 6 statik fabrika yöntemleri vardır:

  • of(int year, int/Month month, int dayOfMonth) (iki aşırı yükler)
  • ofEpochDay(long epochDay)
  • ofYearDay(int year, int dayOfYear)
  • parse(CharSequence text)
  • parse(CharSequence text, DateTimeFormatter formatter)

Çeşitli parametrelerin anlamlarını, çok benzer parametre türlerine sahip bir grup kurucudan ziyade, ayrı ayrı adlandırılmış yöntemler olarak sunarak anlamak çok daha açık; Fabrika metotları için parametrelerin ne olması gerektiğini tahmin edebilirsiniz, oysa "adsız" kurucularsa Javadoc'u (şok korku) okumak zorunda kalabilirsiniz.

Kuşkusuz, of bu isimlerin net azından - ancak, bu en sık kullanılan fabrika yöntemi olduğundan şüpheleniyorsanız, ve bu uzun Adını her zaman hemen yazın çok kalabalık var - Bir ofYearMonthDayOfMonth isteyebilirsiniz.


Eğer tüm mühendisler üzerinde statik fabrika yöntemleri tercih etmeye neden ve ne zaman hakkında Etkili Java 2nd Edition olduğu Öğe 1, okumadım ettik. Burada bahsettiğim "adlandırılmış yapıcı" avantajı aslında Bloch'un öne çıkan ilk avantajı.

+0

Teşekkürler! Şimdi açık. Gönderiim, Etkin Java'nın bir öz/özetine bağlantı içerir. Java SE 8 API'lerinde bu ilkelerin nasıl uygulandığını göremedim. – Alex

+0

Şimdi iki yanıtım var ve her cevap benim soruların yarısını veriyor. – Alex

+2

@Alex Peter bir noktadan ya da ikiden kısacık bir şey değil, zavallı küçük benliğe yardım etmeyecek ...: p Endişelenmeyin, eminim ki ikimiz de rahatsız olacağız diğerini seçersiniz. –