Como declarar um método que não pode mudar os membros da classe em Java? [duplicado]

Nov 30 2020

Em C ++, fazemos um método constante e, portanto, ele não pode alterar o valor dos membros da classe, mas como posso fazer isso em Java? Tentei a declaração do método final, que seria o equivalente às consts em C ++, mas os métodos finais são outra coisa diferente. Eu quero fazer um método getter, então ele não pode alterar os valores, apenas lê-lo. Como um método somente leitura.

Respostas

10 AlexShesterov Nov 30 2020 at 17:16

Em Java, não é possível impedir declarativamente que um método altere campos não finais. Não existe "const correção" em Java.

Se um campo de classe não for - final, ele pode ser alterado por qualquer método da classe.

Observe que finalfunciona de maneira diferente em campos e variáveis ​​em relação a métodos e classes:

  • Um finalcampo ou variável é uma constante. Seu valor não pode ser alterado depois de atribuído.
  • Um finalmétodo não pode ser substituído por classes filhas. finalem métodos não tem nada a ver com "constância".
  • Uma finalclasse não pode ser estendida. finalem classes não tem nada a ver com "constância".

Suas opções em Java são:

  1. Torne sua classe imutável (ou seja, marque todos os seus campos final).
  2. Basta escrever seus getters (e outros métodos não modificadores) com cuidado :)

Mais uma nota. Mesmo em campos e variáveis, o Java finaldifere do C ++ const. Por exemplo:

  • finalas variáveis ​​não podem ser alteradas depois de atribuídas, mas você pode atribuí-las após a declaração. Exemplo:

      final int value;
      if (condition) {
          value = 1; // Ok!
      } else {
          value = 2; // Ok!
      }
      value = 3; // Compile error: value already assigned.
    
  • finalcampos de classe devem ser atribuídos - diretamente ou de dentro de um construtor. Mas esses campos podem ser atribuídos em qualquer lugar dentro de um construtor. Não há nada especial como a "lista de inicializadores" do C ++ em Java.

  • A declaração de campo / variável / parâmetro final Object objem Java é aproximadamente equivalente a uma referência (const-) a um objeto não const em C ++. Isso significa que você não pode reatribuir a referência , mas pode alterar o próprio objeto referenciado. Um exemplo:

      // Note that (obsolete) Date class is mutable in Java.
      final Date myDate = new Date();
    
      myDate = new Date(); // Compilation error: can't reassign a final reference!
    
      myDate.setTime(4711); // Ok, mutating referenced object is allowed!
    
salapura.stefan Nov 30 2020 at 17:17

Você não pode fazer isso. O método final significa que não pode ser substituído.