Eu estava tentando identificar o motivo por trás das constantes em Java. Aprendi que o Java nos permite declarar constantes usando a final
palavra-chave.
Minha pergunta é por que o Java não introduziu um const
recurso Constant ( ). Como muitas pessoas dizem que veio do C ++, no C ++ temos a const
palavra-chave.
Por favor, compartilhe seus pensamentos.
const
palavra-chave, mas não há nenhum recurso subjacente. Corrigido seu título e tags de acordo.Respostas:
Toda vez que eu passo da pesada codificação C ++ para Java, levo um tempo para me adaptar à falta de correção constante em Java. Esse uso
const
no C ++ é muito diferente do que apenas declarar variáveis constantes, se você não sabia. Essencialmente, ele garante que um objeto seja imutável quando acessado por meio de um tipo especial de ponteiro chamado const-pointer. Quando em Java, em locais onde normalmente eu gostaria de retornar um const-pointer, retorno uma referência com um tipo de interface. contendo apenas métodos que não devem ter efeitos colaterais. Infelizmente, isso não é imposto pelo idioma.A Wikipedia oferece as seguintes informações sobre o assunto:
fonte
final
é semelhante, no entanto.final
O método, por exemplo, funciona completamente diferente dosconst
métodos C ++ .final
palavra - chave em propriedades ou variáveis apenas garante que uma propriedade ou variável seja atribuída apenas uma vez . Ainda é possível alterar o estado desse objeto, por exemplo, chamando algum método com efeitos colaterais.final
É um pouco semelhante empilhar a alocação de C ++ em termos de referência a um objeto em vez de um ponteiro, mas é tudo. Isso é claro, além do que o dom0 já disse.final
em Java parece funcionar como C ++const
para tipos de valor, mas mais como um C ++ não-constT&
para tipos de referênciaO que
const
significaPrimeiro, saiba que a semântica de uma palavra-chave "const" significa coisas diferentes para pessoas diferentes:
final
semântica Java - a própria variável de referência não pode ser reatribuída para apontar para outra instância (local da memória), mas a própria instância é modificávelconst
ponteiro C / semântica de referência - significa que esta referência não pode ser usada para modificar a instância (por exemplo, não pode atribuir a variáveis de instância, não pode invocar métodos mutáveis) - afeta apenas a variável de referência, portanto, uma referência não-const apontando para mesma instância pode modificar a instânciaPor que ou por que não?
const
Segundo, se você realmente deseja explorar alguns dos argumentos "pro" vs "con", consulte a discussão sob este "bug" da solicitação de aprimoramento (RFE). Esse RFE solicita um recurso "referência somente leitura" - tipo "const". Aberto em 1999 e depois fechado / rejeitado pela Sun em 2005, o tópico "const" foi vigorosamente debatido:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4211070
Embora existam muitos bons argumentos de ambos os lados, algumas das razões frequentemente citadas (mas não necessariamente convincentes ou claras)
const
incluem:const
significa acima)Antes que alguém tente me debater sobre se essas são boas ou más razões, observe que essas não são minhas razões . Eles são simplesmente a "essência" de algumas das razões pelas quais eu reclamei ao examinar a discussão da RFE. Eu não necessariamente concordo com eles - estou apenas tentando citar por que algumas pessoas (não eu) podem achar que uma
const
palavra - chave pode não ser uma boa idéia. Pessoalmente, eu gostaria que mais semânticas "const" fossem introduzidas no idioma de maneira inequívoca.fonte
volatile
tão simples de entender? Oufinal
? Meh.const
em C ++ não significa que um valor é uma constante.const
em C ++ implica que o cliente de um contrato se comprometa a não alterar seu valor.Se o valor de uma
const
expressão muda, fica mais evidente se você estiver em um ambiente que suporta simultaneidade baseada em encadeamento.Como o Java foi projetado desde o início para oferecer suporte à simultaneidade de encadeamentos e bloqueios, não causou confusão ao sobrecarregar o termo para ter a semântica existente
final
.por exemplo:
saídas 42 e 7.
Embora
x
marcado comoconst
, como um alias não constante é criado,x
não é uma constante. Nem todo compilador exigevolatile
esse comportamento (embora seja permitido a cada compilador incorporar a constante)Com sistemas mais complicados, você obtém alias const / non-const sem o uso de
const_cast
, portanto, adquirindo o hábito de pensar que const significa que algo não vai mudar se torna cada vez mais perigoso.const
significa apenas que seu código não pode alterá-lo sem uma conversão, não que o valor seja constante.fonte
const
, não significa que um valor seja constante. Isso significa que o cliente de um valor está restrito a não modificá-lo. No seu exemplo, não há alias; portanto, todos os usuários estão sob a mesma restrição. Este não é o caso em geral.const
afeta os clientes, não o valor - ele diz que você não pode mudá-lo, não que isso não mude.immutable interface
eimmutable object
é uma outra maneira (beatable com o elenco e reflexão) para const mímico em Java. Const "True" pode ser feito com SealedObject , mas isso destrói o caso de uso do nosso objeto.Essa é uma pergunta um pouco antiga, mas pensei em contribuir com meus 2 centavos de qualquer maneira, já que esse tópico surgiu na conversa hoje.
Isso não responde exatamente por que não há const? mas como tornar suas aulas imutáveis. (Infelizmente ainda não tenho reputação suficiente para postar como comentário na resposta aceita)
A maneira de garantir a imutabilidade de um objeto é projetar suas classes com mais cuidado para serem imutáveis. Isso requer um pouco mais de cuidado do que uma classe mutável.
Isso remonta ao item efetivo Java de Josh Bloch 15 - Minimizar a mutabilidade . Se você ainda não leu o livro, pegue uma cópia e leia-a algumas vezes, garanto que ele exibirá seu "jogo java" figurativo .
No item 15, Bloch sugere que você limite a mutabilidade das classes para garantir o estado do objeto.
Para citar o livro diretamente:
Bloch descreve como tornar suas aulas imutáveis, seguindo 5 regras simples:
final
).final
.private
.Para mais detalhes, eu recomendo pegar uma cópia do livro.
fonte
A semântica de C ++ de
const
é muito diferente de Javafinal
. Se os designers tivessem usadoconst
isso, seria desnecessariamente confuso.O fato de
const
ser uma palavra reservada sugere que os designers tinham idéias para implementarconst
, mas desde então decidiram contra; veja este bug fechado . Os motivos declarados incluem que adicionar suporte ao estilo C ++const
causaria problemas de compatibilidade.fonte
Existe uma maneira de criar variáveis "const" em Java, mas apenas para classes específicas. Basta definir uma classe com propriedades finais e subclassificá-la. Em seguida, use a classe base onde você deseja usar "const". Da mesma forma, se você precisar usar os métodos "const", adicione-os à classe base. O compilador não permitirá que você modifique o que considera os métodos finais da classe base, mas lerá e chamará métodos na subclasse.
fonte
Haveria duas maneiras de definir constantes -
const
estatic final
, com a mesma semântica exata. Além disso,static final
descreve o comportamento melhor do queconst
fonte
static
(não pertence a instância específica) efinal
- não pode ser alterada.Você pode usar estática final para criar algo que funcione de maneira semelhante à Const. Eu usei isso no passado.
fonte