Parece ser ortodoxia Java neste momento que basicamente nunca se deve usar campos públicos para o estado do objeto. (Não concordo necessariamente, mas isso não é relevante para a minha pergunta.) Dado isso, seria correto dizer que de onde estamos hoje, é claro que os campos públicos de Java foram um erro / falha do design da linguagem? Ou existe um argumento racional de que eles são uma parte útil e importante da linguagem, até hoje?
Obrigado!
Atualização: conheço as abordagens mais elegantes, como em C #, Python, Groovy etc. Não estou procurando diretamente esses exemplos. Estou realmente me perguntando se ainda há alguém no fundo de um bunker, murmurando sobre como os campos públicos são realmente maravilhosos e como as massas são todas apenas ovelhas, etc.
Atualização 2: Campos públicos finais claramente estáticos são a maneira padrão de criar constantes públicas. Eu estava me referindo mais ao uso de campos públicos para o estado do objeto (mesmo estado imutável). Estou pensando que parece uma falha de design que se deva usar campos públicos para constantes, mas não para o estado ... as regras de uma linguagem devem ser aplicadas naturalmente, pela sintaxe, não pelas diretrizes.
Respostas:
Gosto deles, desde que o campo seja final e seja usado apenas internamente no aplicativo, não exposto em uma API para outros aplicativos. Isso mantém seu código mais curto e mais legível.
Você não deve expor campos públicos em uma API porque, ao expor campos públicos, você também expõe a implementação. Se você o expuser como
getXXX()
método, poderá alterar a implementação sem alterar a interface da API. Por exemplo, você pode alterar e obter o valor de um serviço remoto, mas os aplicativos que usam a API não precisam saber disso.Esse é um design viável para
public final
campos em classes imutáveis .Do Java eficaz :
Consulte também Por que não devo usar POJOs imutáveis em vez de JavaBeans?
fonte
getXXX()
método, poderá alterar a implementação sem alterar a interface da API. Por exemplo, você pode alterar e obter o valor de um serviço remoto, mas os aplicativos que usam a API não precisam saber disso.O uso de pares de métodos get / set é a falha trágica do design histórico. Não consigo pensar em outra linguagem que implemente propriedades de maneira verbal e ineficiente.
fonte
Eu acho que os campos públicos são adequados para uma classe que é essencialmente um tipo de valor como um número complexo ou um ponto, onde a classe faz pouco mais do que agrupar tipos primitivos como uma estrutura no estilo C e talvez definir alguns operadores.
fonte
java.awt.Point
e amigos são um pesadelo.Point
é que é ambíguo se uma variável do tipoPoint
deve encapsular um local ou se deve encapsular a identidade de uma entidade com um local que pode mudar. Conceitualmente, eu consideraria o código que passa por aíPoint
como o código que passa por arrays.Point
e modificá-lo, devo esperar que o objeto a que ele se refira seja atualizado corretamente na tela? Não, o problemaPoint
é que é mutável. Nós tínhamosString
/StringBuffer
mas a idéia não parecia ter sucesso. / Passar matrizes ao redor tem problemas semelhantes.Para definir constantes públicas, ainda é útil. Por exemplo
No entanto, ainda prefira enum sempre que possível. Por exemplo
Para simular classes simples de estrutura também é útil. Não há razão para criar um getter e setter para todos os campos, quando todos são públicos de qualquer maneira.
fonte
Antes que os IDEs se generalizassem, tornar públicos todos os seus campos era uma ferramenta poderosa para criar protótipos / provas de conceitos rapidamente.
Atualmente, há muito pouca desculpa para usá-los, quando você pode gerar um par getter / setter com um clique do mouse.
fonte
public final
campos são mais legíveis que 10getXXX()
métodos.const
palavra - chave seria suficiente; se não forem estáticos, eles são uma violação grave do encapsulamento.Isso é subjetivo, mas minha opinião é que toda a noção pública / privada está desatualizada e atrasada.
Em python não há público / privado; tudo é público basicamente. Não causou muitos problemas.
Em Java, você tende a criar getters / setters inúteis para cada campo, para evitar o pecado de marcá-los como "públicos". (IMHO, se você estiver fazendo isso, basta marcá-los como públicos).
fonte