2016-07-17 18 views
5

Tại sao các đối tượng LocalDate, LocalTime, Stream, v.v. sử dụng phương pháp nhà máy of() thay vì một hàm tạo?Tại sao các đối tượng LocalDate, LocalTime và Stream sử dụng phương thức factory() thay vì một hàm tạo?

Tôi đã tìm thấy giải thích tại sao nên sử dụng phương pháp nhà máy thay vì newhere. Câu trả lời này đưa ra một số lý do, nhưng điều duy nhất có liên quan đến Java Date/Time API như sau:

không giống như các nhà xây dựng, họ không bắt buộc phải tạo một đối tượng mới mỗi thời gian chúng được gọi

LocalDateLocalTime là không thay đổi, nên sử dụng nhà máy và sử dụng lại các đối tượng hiện có thay vì tạo đối tượng mới mỗi lần.

Đó có phải là lý do tại sao các đối tượng như LocalDateLocalTime được tạo bằng phương pháp nhà máy (ví dụ: LocalDate.of())? Có lý do nào khác không?

Ngoài ra, Stream đối tượng có thể thay đổi. Tại sao một phương pháp nhà máy (Stream.of()) được sử dụng để tạo ra một Stream?

+1

Câu trả lời cho [câu hỏi có liên quan này về lập trình viên] (http://programmers.stackexchange.com/q/322936/187318) cũng có thể thú vị. – Hulk

Trả lời

10

Tại sao phương thức nhà máy (Stream.of()) được sử dụng để tạo Luồng?

Sử dụng phương pháp nhà máy có nghĩa là bạn không cần phải biết chính xác lớp được sử dụng. Đây là một ví dụ tốt vì Stream là một giao diện và bạn không thể tạo một thể hiện của một giao diện.

Từ nguồn cho 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); 
} 

Lưu ý: những phương pháp gọi các phương thức nhà máy khác.

Bạn có thể thấy bạn nhận được các công trình xây dựng khác nhau tùy thuộc vào cách nó được gọi. Bạn không cần biết điều này hoặc lớp học tối thượng được tạo ra là ReferencePipeline.Head

+1

Cảm ơn! Tôi chấp nhận câu trả lời này là câu trả lời nhất, nhưng câu trả lời của Andy Turner trả lời phần thứ hai của câu hỏi của tôi. – Alex

7

+1 cho câu trả lời của Peter.

Một lý do khác để sử dụng các phương thức của nhà máy là chúng hoạt động như "các nhà thầu có tên".

Ví dụ, LocalDate có 6 phương pháp nhà máy tĩnh (ít nhất, tôi có thể không đầy đủ ở đây):

  • of(int year, int/Month month, int dayOfMonth) (hai quá tải)
  • ofEpochDay(long epochDay)
  • ofYearDay(int year, int dayOfYear)
  • parse(CharSequence text)
  • parse(CharSequence text, DateTimeFormatter formatter)

Tôi nghĩ rằng sẽ dễ hiểu hơn về ý nghĩa của các tham số khác nhau bằng cách sử dụng các phương thức này, chứ không phải là một loạt các hàm tạo với các kiểu tham số rất giống nhau; bạn có thể đoán được những thông số nào cần cho các phương thức của nhà máy, trong khi bạn thực sự phải đọc Javadoc (kinh dị sốc) nếu chúng là các nhà xây dựng "vô danh". Phải thừa nhận rằng, là ít rõ ràng nhất của những tên này - người ta có thể muốn ofYearMonthDayOfMonth - tuy nhiên, tôi nghi ngờ rằng đây là phương pháp nhà máy được sử dụng phổ biến nhất, và nó quá lộn xộn để gõ tên dài tất cả các thời gian.


Trong trường hợp bạn đã không đọc nó, khoản 1 Java hiệu quả 2nd Edition là tất cả về lý do tại sao và khi nào thì thích phương pháp nhà máy tĩnh hơn nhà xây dựng. Lợi thế "được đặt tên constructor" tôi đề cập ở đây thực sự là lợi thế đầu tiên của Bloch.

+0

Cảm ơn! Bây giờ nó rõ ràng. Bài đăng của tôi chứa một liên kết đến một trích xuất/tóm tắt của Java hiệu quả. Tôi không thể thấy các nguyên tắc này được áp dụng như thế nào trong các API Java SE 8. – Alex

+0

Bây giờ tôi có hai câu trả lời và mỗi câu trả lời cho một nửa câu hỏi của tôi. Tôi sẽ gặp rắc rối khi chọn một người để chấp nhận) – Alex

+2

@ Alex Peter rõ ràng là không thiếu một hoặc hai điểm, giúp đỡ ít tôi ...; p Đừng lo lắng, tôi chắc chắn không phải chúng tôi, chúng tôi sẽ bị xúc phạm nếu bạn chọn cái kia. –

Các vấn đề liên quan