Không có gì sai với các lớp tĩnh thực sự tĩnh . Điều đó có nghĩa là, không có trạng thái nội bộ để nói về điều đó sẽ khiến đầu ra của các phương thức thay đổi.
Nếu Dice.roll()
chỉ đơn giản là trả về một số ngẫu nhiên mới từ 1 đến 6, thì nó không thay đổi trạng thái. Cấp, bạn có thể đang chia sẻ một Random
ví dụ, nhưng tôi sẽ không xem xét rằng việc thay đổi trạng thái theo định nghĩa, đầu ra luôn luôn sẽ tốt, ngẫu nhiên. Nó cũng là chủ đề an toàn vì vậy không có vấn đề ở đây.
Bạn sẽ thường thấy "Trình trợ giúp" cuối cùng hoặc các lớp tiện ích khác có hàm tạo riêng và các thành viên tĩnh. Hàm tạo riêng không chứa logic và chỉ phục vụ để ngăn người nào đó khởi tạo lớp. Công cụ sửa đổi cuối cùng chỉ mang ý tưởng này về nhà rằng đây không phải là một lớp học mà bạn muốn xuất phát. Nó chỉ đơn thuần là một lớp tiện ích. Nếu được thực hiện đúng cách, sẽ không có thành viên độc thân hoặc các thành viên khác trong lớp không phải là tĩnh và cuối cùng.
Vì vậy, miễn là bạn tuân theo các nguyên tắc này và bạn không tạo ra singletons, điều này hoàn toàn không có gì sai. Bạn đề cập đến một lớp trình điều khiển và điều này gần như chắc chắn sẽ yêu cầu thay đổi trạng thái, vì vậy tôi khuyên bạn không nên chỉ sử dụng các phương thức tĩnh. Bạn có thể phụ thuộc rất nhiều vào một lớp tiện ích tĩnh, nhưng bạn không thể biến nó thành một lớp tiện ích tĩnh.
Điều gì được coi là một sự thay đổi trong trạng thái cho một lớp học? Chà, cho phép loại trừ các số ngẫu nhiên trong một giây, vì chúng không xác định theo định nghĩa và do đó giá trị trả về thường thay đổi.
Hàm thuần túy là một hàm có tính xác định, nghĩa là, đối với một đầu vào nhất định, bạn sẽ nhận được một và chính xác một đầu ra. Bạn muốn các phương thức tĩnh là các hàm thuần túy. Trong Java có nhiều cách điều chỉnh hành vi của các phương thức tĩnh để giữ trạng thái, nhưng chúng hầu như không bao giờ là ý tưởng hay. Khi bạn khai báo một phương thức là tĩnh , lập trình viên điển hình sẽ giả sử ngay lập tức rằng đó là một hàm thuần túy. Khác biệt với hành vi dự kiến là cách bạn có xu hướng tạo ra lỗi trong chương trình của mình, nói chung và nên tránh.
Một singleton là một lớp chứa các phương thức tĩnh đối nghịch với "hàm thuần túy" như bạn có thể. Một thành viên riêng tư tĩnh được giữ bên trong lớp được sử dụng để đảm bảo có chính xác một trường hợp. Đây không phải là cách thực hành tốt nhất và có thể khiến bạn gặp rắc rối sau này vì một số lý do. Để biết những gì chúng ta đang nói về, đây là một ví dụ đơn giản về một người độc thân:
// DON'T DO THIS!
class Singleton {
private String name;
private static Singleton instance = null;
private Singleton(String name) {
this.name = name;
}
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton("George");
}
return instance;
}
public getName() {
return name;
}
}
assert Singleton.getInstance().getName() == "George"