Tôi có một lớp đầy đủ các chức năng tiện ích. Khởi tạo một thể hiện của nó không có ý nghĩa ngữ nghĩa, nhưng tôi vẫn muốn gọi các phương thức của nó. Cách tốt nhất để đối phó với điều này là gì? Lớp tĩnh? Trừu tượng?
Tôi có một lớp đầy đủ các chức năng tiện ích. Khởi tạo một thể hiện của nó không có ý nghĩa ngữ nghĩa, nhưng tôi vẫn muốn gọi các phương thức của nó. Cách tốt nhất để đối phó với điều này là gì? Lớp tĩnh? Trừu tượng?
Câu trả lời:
Hàm tạo riêng và các phương thức tĩnh trên một lớp được đánh dấu là cuối cùng.
Theo cuốn sách tuyệt vời "Java hiệu quả" :
Mục 4: Thi hành tính không đáng kể với một nhà xây dựng tư nhân
- Cố gắng thực thi tính không đáng kể bằng cách làm cho một lớp trừu tượng không hoạt động.
- Một hàm tạo mặc định chỉ được tạo nếu một lớp không chứa các hàm tạo rõ ràng, do đó một lớp có thể được tạo thành không đáng kể bằng cách bao gồm một hàm tạo riêng:
// Noninstantiable utility class
public class UtilityClass
{
// Suppress default constructor for noninstantiability
private UtilityClass() {
throw new AssertionError();
}
}
Bởi vì hàm tạo rõ ràng là riêng tư, nó không thể truy cập được bên ngoài lớp. AssertsError không bắt buộc nghiêm ngặt, nhưng nó cung cấp bảo hiểm trong trường hợp hàm tạo vô tình được gọi từ trong lớp. Nó đảm bảo rằng lớp sẽ không bao giờ được khởi tạo trong bất kỳ trường hợp nào. Thành ngữ này hơi phản trực giác, vì hàm tạo được cung cấp rõ ràng để nó không thể được gọi. Do đó, khôn ngoan là bao gồm một nhận xét, như được hiển thị ở trên.
Là một tác dụng phụ, thành ngữ này cũng ngăn lớp bị phân lớp. Tất cả các hàm tạo phải gọi một hàm tạo của lớp bậc trên, rõ ràng hoặc ẩn và một lớp con sẽ không có hàm tạo của lớp bậc trên có thể truy cập được để gọi.
AssertionError
qua lựa chọn thay thế khác như IllegalStateException
, UnsupportedOperationException
, vv?
Âm thanh như bạn có một lớp tiện ích tương tự như java.lang.Math .
Cách tiếp cận có lớp cuối cùng với hàm tạo riêng và các phương thức tĩnh.
Nhưng hãy cẩn thận với những gì nó làm cho khả năng kiểm tra, tôi khuyên bạn nên đọc bài viết này Phương thức tĩnh là cái chết đối với khả năng kiểm tra
Chỉ cần bơi ngược dòng, các thành viên tĩnh và các lớp không tham gia vào OO và do đó là xấu xa. Không, không phải là xấu, nhưng nghiêm túc, tôi muốn giới thiệu một lớp học bình thường với một mẫu đơn để truy cập. Bằng cách này, nếu bạn cần ghi đè hành vi trong mọi trường hợp, đó không phải là một trang bị chính. OO là bạn của bạn :-)
$ 0,02 của tôi
nhận xét về các đối số "nhà xây dựng riêng": thôi nào, các nhà phát triển không phải là ngu ngốc; nhưng họ lười biếng tạo một đối tượng sau đó gọi phương thức tĩnh? sẽ không xảy ra.
đừng dành quá nhiều thời gian để đảm bảo rằng lớp học của bạn không thể bị lạm dụng. có một số niềm tin cho các đồng nghiệp của bạn. và luôn có một cách để lạm dụng lớp học của bạn cho dù bạn bảo vệ nó như thế nào. điều duy nhất không thể bị lạm dụng là một thứ hoàn toàn vô dụng.
Không có điểm nào trong việc khai báo lớp là static
. Chỉ cần khai báo các phương thức của nó static
và gọi chúng từ tên lớp là bình thường, như lớp Math của Java .
Ngoài ra, mặc dù không nhất thiết phải làm cho nhà xây dựng riêng tư, nhưng đó là một ý tưởng tốt để làm như vậy. Việc đánh dấu riêng của hàm tạo sẽ ngăn người khác tạo các thể hiện của lớp của bạn, sau đó gọi các phương thức tĩnh từ các thể hiện đó. (Các cuộc gọi này hoạt động giống hệt nhau trong Java, chúng chỉ gây hiểu lầm và làm tổn thương tính dễ đọc của mã của bạn.)
Bạn có thể sử dụng chú thích @UtilityClass từ lombok https://projectlombok.org/features/experimental/UtilityClass