Це скоріше стилістична річ, ніж пряма проблема. Це говорить про те, що ви неправильно не продумали, що відбувається з класом.
Подумайте, що static
означає:
Ця змінна існує на рівні класу, вона не існує окремо для кожного примірника і не має самостійного існування в класах, які мене розширюють .
Подумайте, що protected
означає:
Ця змінна може бачити цей клас, класи в одному пакеті та класи, які розширюють мене .
Два значення не зовсім взаємовиключні, але вони досить близькі.
Єдиний випадок, коли я можу побачити, де ви могли б використовувати ці два разом, - якщо у вас був абстрактний клас, розроблений для розширення, і клас, що розширюється, міг би змінити поведінку за допомогою констант, визначених у оригіналі. Таке домовленість, швидше за все, закінчиться дуже безладним і вказує на слабкість у дизайні класів.
У більшості випадків було б краще, щоб константи були публічними, оскільки це просто робить все більш чистим і дозволяє людям підкласифікувати більшу гнучкість. В цілому, крім усього іншого, склад композиції є переважним у спадок, тоді як абстрактні класи примушують наслідувати.
Щоб побачити один приклад того, як це може розбити речі, і проілюструвати, що я маю на увазі під змінною, що не має незалежного існування, спробуйте цей приклад коду:
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;
}
}
Ви побачите результати:
test
changed
Спробуйте самі: https://ideone.com/KM8u8O
Клас Test2
може отримати доступ до статичного члена test
з того, що Test
не потрібно кваліфікувати ім'я, але він не успадковує та не отримує власну копію. Він дивиться на той самий об’єкт у пам’яті.
final
. Змінне статичне поле, яке поділяється між класами, безумовно, викликає занепокоєння. Кілька класів, що оновлюють статичне поле, швидше за все, не будуть надійними або легкими для слідування, тим більше, що наявність будь-якого захищеного поля або методу означає, що клас призначений для розширення класами в інших пакетах, можливо, класами, що не перебувають під контролем автор класу, що містить захищене поле.