É mais uma coisa estilística do que um problema direto. Isso sugere que você não pensou adequadamente no que está acontecendo com a classe.
Pense no que static
significa:
Essa variável existe no nível da classe, não existe separadamente para cada instância e não existe uma existência independente nas classes que me estendem .
Pense no que protected
significa:
Essa variável pode ser vista por essa classe, classes no mesmo pacote e classes que me estendem .
Os dois significados não são exatamente mutuamente exclusivos, mas são bem próximos.
O único caso em que posso ver onde você pode usar os dois juntos é se você tivesse uma classe abstrata que foi projetada para ser estendida e a classe estendida pudesse modificar o comportamento usando constantes definidas no original. Esse tipo de arranjo provavelmente acabaria muito confuso e indica fraqueza no design das classes.
Na maioria dos casos, seria melhor ter as constantes como públicas, pois isso apenas torna tudo mais limpo e permite que as pessoas subclasses tenham mais flexibilidade. Independentemente de qualquer outra coisa, em muitos casos, a composição é preferível à herança, enquanto as classes abstratas forçam a herança.
Para ver um exemplo de como isso pode quebrar as coisas e ilustrar o que quero dizer com a variável que não possui existência independente, tente este código de exemplo:
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;
}
}
Você verá os resultados:
test
changed
Experimente você mesmo em: https://ideone.com/KM8u8O
A classe Test2
é capaz de acessar o membro estático test
partir Test
sem a necessidade de qualificar o nome - mas não herda ou obter sua própria cópia. Ele está olhando exatamente para o mesmo objeto na memória.
final
. Um campo estático mutável compartilhado entre classes é definitivamente motivo de preocupação. É provável que várias classes que atualizam um campo estático não sejam confiáveis ou fáceis de seguir, especialmente porque a presença de qualquer campo ou método protegido implica que a classe deve ser estendida por classes em outros pacotes, possivelmente classes que não estão sob o controle do autor da classe que contém o campo protegido.