Это скорее стилистическая вещь, чем прямая проблема. Это говорит о том, что вы не продумали как следует, что происходит с классом.
Подумайте, что 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
. Изменяемое статическое поле, разделяемое всеми классами, определенно вызывает беспокойство. Множественные классы, обновляющие статическое поле, вряд ли будут надежными или легкими для отслеживания, тем более, что присутствие любого защищенного поля или метода подразумевает, что класс предназначен для расширения классами в других пакетах, возможно, классами, не находящимися под контролем автор класса, содержащего защищенное поле.