Đó là một vấn đề mang tính phong cách hơn là một vấn đề trực tiếp. Nó cho thấy rằng bạn đã không suy nghĩ đúng đắn về những gì đang diễn ra với lớp học.
Hãy nghĩ về những gì static
có nghĩa là:
Biến này tồn tại ở cấp độ lớp, nó không tồn tại riêng biệt cho từng cá thể và nó không tồn tại độc lập trong các lớp mở rộng tôi .
Hãy nghĩ về những gì protected
có nghĩa là:
Biến này có thể được nhìn thấy bởi lớp này, các lớp trong cùng một gói và các lớp mở rộng tôi .
Hai ý nghĩa không hoàn toàn loại trừ nhau nhưng nó khá gần nhau.
Trường hợp duy nhất tôi có thể thấy nơi bạn có thể sử dụng cả hai cùng nhau là nếu bạn có một lớp trừu tượng được thiết kế để mở rộng và lớp mở rộng sau đó có thể sửa đổi hành vi bằng cách sử dụng các hằng số được xác định trong bản gốc. Mặc dù vậy, kiểu sắp xếp đó rất có thể sẽ rất lộn xộn và chỉ ra điểm yếu trong thiết kế của các lớp.
Trong hầu hết các trường hợp, sẽ tốt hơn nếu để các hằng số là công khai vì điều đó chỉ làm cho mọi thứ sạch sẽ hơn và cho phép mọi người phân loại phụ linh hoạt hơn. Hoàn toàn khác với bất kỳ thứ gì khác trong nhiều trường hợp, thành phần được ưu tiên hơn là kế thừa, trong khi các lớp trừu tượng buộc kế thừa.
Để xem một ví dụ về cách điều này có thể phá vỡ mọi thứ và để minh họa ý của tôi khi biến không tồn tại độc lập, hãy thử mã ví dụ sau:
public class Program {
public static void main (String[] args) throws java.lang.Exception {
System.out.println(new Test2().getTest());
Test.test = "changed";
System.out.println(new Test2().getTest());
}
}
abstract class Test {
protected static String test = "test";
}
class Test2 extends Test {
public String getTest() {
return test;
}
}
Bạn sẽ thấy kết quả:
test
changed
Hãy tự mình thử tại: https://ideone.com/KM8u8O
Lớp Test2
có thể truy cập thành viên tĩnh test
từ đó Test
mà không cần đặt tên đủ điều kiện - nhưng nó không kế thừa hoặc lấy bản sao của chính nó. Nó đang nhìn vào cùng một đối tượng trong bộ nhớ.
final
. Một trường tĩnh có thể thay đổi được chia sẻ giữa các lớp chắc chắn là nguyên nhân gây lo lắng. Nhiều lớp cập nhật một trường tĩnh không có khả năng đáng tin cậy hoặc dễ theo dõi, đặc biệt vì sự hiện diện của bất kỳ trường hoặc phương thức được bảo vệ nào ngụ ý rằng lớp đó được mở rộng bởi các lớp trong các gói khác, có thể là các lớp không nằm dưới sự kiểm soát của tác giả của lớp chứa trường được bảo vệ.