Tôi đã không thiết kế hoặc viết API ngày giờ của Java, vì vậy tôi không thể dứt khoát nói "tại sao họ lại làm theo cách này". Tuy nhiên tôi có thể đề xuất hai lý do chính họ nên làm theo cách này:
- Sức mạnh biểu cảm
- Dạng song song
Trước tiên, hãy xem xét bối cảnh: mã ngày và mã thời gian của Java là một gói lớn, phức tạp xử lý một vấn đề rất phức tạp. Phổ biến như "thời gian" là, việc thực hiện khái niệm này bao gồm hàng tá cách hiểu và định dạng, với các biến thể giữa các vị trí địa lý (múi giờ), ngôn ngữ, hệ thống lịch, độ phân giải đồng hồ, thang đo thời gian, biểu diễn số, nguồn dữ liệu và khoảng thời gian. Deltas khắc phục (ví dụ: năm nhuận / ngày) là phổ biến và có thể được chèn bất thường bất cứ lúc nào (giây nhuận). Tuy nhiên, gói là một tính năng cốt lõi, có khả năng được sử dụng rộng rãi và dự kiến sẽ xử lý tất cả các biến thể đó một cách chính xác và chính xác. Đó là một trật tự cao. Kết quả, không đáng ngạc nhiên, là một API phức tạp bao gồm nhiều lớp, mỗi lớp có nhiều phương thức.
Bây giờ, tại sao sử dụng of
các phương thức chứ không phải là một hàm tạo lớp "thông thường"? Ví dụ , tại sao LocalDate.of(...)
, LocalDate.ofEpochDay(...)
và LocalDate.ofYearDay(...)
thay vì chỉ một số ít các new LocalDate(...)
cuộc gọi?
Đầu tiên, sức mạnh biểu cảm : Các phương thức được đặt tên riêng lẻ thể hiện ý định xây dựng và hình thức của dữ liệu được tiêu thụ.
Giả sử trong giây lát rằng quá tải phương thức của Java là đủ để cho phép nhiều loại hàm tạo mà bạn muốn. (Không tham gia vào một cuộc thảo luận về tính năng ngôn ngữ xung quanh việc gõ vịt và đơn so với động so với nhiều công văn tôi sẽ chỉ nói: đôi khi điều này là đúng, đôi khi không. Hiện tại, chỉ giả sử không có giới hạn kỹ thuật.)
Có thể tài liệu của nhà xây dựng có thể nêu "khi chỉ được thông qua một long
giá trị duy nhất , giá trị đó được hiểu là số ngày kỷ nguyên, không phải là một năm." Nếu các kiểu dữ liệu mức thấp được truyền cho các hàm tạo khác là khác nhau (ví dụ: chỉ sử dụng trường hợp epoch long
và tất cả các hàm tạo khác sử dụng int
), bạn có thể thoát khỏi điều này.
Nếu bạn đã xem mã gọi một hàm LocalDate
tạo với một hàm duy nhất long
, nó sẽ trông rất giống với mã trong đó một năm được truyền vào, đặc biệt là với một năm được cho là trường hợp phổ biến nhất. Có nhà xây dựng chung đó có thể là có thể, nhưng nó sẽ không nhất thiết dẫn đến sự rõ ràng tuyệt vời.
API gọi rõ ràng ofEpochDay
, tuy nhiên, báo hiệu một sự khác biệt rõ ràng về đơn vị và ý định. Tương tự như vậy LocalDate.ofYearDay
báo hiệu rằng month
tham số chung đang bị bỏ qua và tham số ngày, trong khi vẫn là int
, dayOfYear
không phải là a dayOfMonth
. Các phương thức xây dựng rõ ràng được dự định để diễn tả những gì đang diễn ra với sự rõ ràng hơn.
Các ngôn ngữ tự động và gõ vịt như Python và JavaScript có các phương tiện khác để báo hiệu các diễn giải thay thế (ví dụ: các tham số tùy chọn và giá trị sentinel ngoài băng ), nhưng ngay cả các nhà phát triển Python và JS thường sử dụng các tên phương thức phân biệt để báo hiệu các cách hiểu khác nhau. Nó thậm chí còn phổ biến hơn trong Java, với cả các ràng buộc kỹ thuật của nó (đó là ngôn ngữ gửi đơn, được gửi tĩnh) và các quy ước / thành ngữ văn hóa của nó.
Thứ hai, hình thức song song . LocalDate
có thể cung cấp một hàm tạo Java tiêu chuẩn ngoài, hoặc thay cho hai of
phương thức của nó . Nhưng đến cuối cùng thì sao? Nó vẫn cần ofEpochDay
và ofDayYear
cho những trường hợp sử dụng. Một số lớp cung cấp cả hàm tạo và tương đương với các ofXYZ
phương thức - ví dụ, cả hai Float('3.14')
và Float.parseFloat('3.14')
tồn tại. Nhưng nếu bạn cần các nhà ofXYZ
xây dựng cho một số thứ, tại sao không sử dụng chúng mọi lúc? Điều đó đơn giản hơn, thường xuyên hơn và song song hơn. Là một kiểu bất biến, phần lớn các LocalDate
phương thức là các hàm tạo. Có nhóm chính bảy trong số các phương pháp mà xây dựng trường mới (tương ứng, at
, from
, minus
, of
, parse
,plus
và with
tiền tố). Trong số LocalDate
hơn 60 phương thức, 35+ là các hàm tạo thực tế . Chỉ có 2 trong số đó có thể dễ dàng chuyển đổi thành các hàm tạo dựa trên lớp tiêu chuẩn. Liệu nó thực sự có ý nghĩa với trường hợp đặc biệt 2 người đó theo cách không song song với tất cả những người khác? Mã khách hàng sử dụng hai hàm tạo trường hợp đặc biệt này sẽ rõ ràng hơn hoặc đơn giản hơn? Chắc là không. Nó thậm chí có thể làm cho mã máy khách trở nên đa dạng hơn và ít đơn giản hơn.