Pergunta

Tem todas as classes finais em imutável Java. Cordas e Integer ambos são classes final e ambos são imutáveis ??eu acredito.

Foi útil?

Solução

Não - um meio classe final você não pode herdar a partir dele. Não tem nada a ver com a mutabilidade. A classe a seguir é final ainda mutável:

public final class FinalMutable {
  int value;
  public void setValue(int v) { value=v; }
  public int getValue() { return value; }
}

Outras dicas

Não, meios finais a classe não pode ser estendida. Não diz nada sobre a mutabilidade. Por exemplo:

final class MutInt {
   public int modifyMe;
}

Não há nenhuma palavra-chave para imutabilidade, é mais como um padrão de design.

EDIT:
Isso significa que não há nenhuma palavra-chave, que faz uma imutável classe. Para fazer uma imutável classe, você tem que proteger os internos por torná-los final ou privado.

A coisa confusa é a seguinte: A palavra-chave final tem significados diferentes quando usado em uma classe, então ele tem quando usado em um campo / variável. O primeiro significa "esta classe não pode ser estendida". O segundo meio "esta variável (ou de referência) não pode ser mudado".

Na sequência das outras respostas, se você olhar para o código para java.lang.String você verá que ele contém um campo: hash, que é mutável e é de fato calculado e armazenado quando hashCode() é chamado para pela primeira vez.

No entanto, a classe ainda é imutável :. O campo hash não pode ser acessado diretamente ou modificado fora da classe

Além disso, você pode observar uma abordagem comum dentro do JDK é a implementação de wrappers imutáveis ??que podem ser usados ??para expor estado interno de um objeto sem permitindo que ele seja modificado; por exemplo.

private final List<String> values;

public List<? get String> getValues() {
  return Collections.unmodifiableList(values);
}

Como já foi dito pelos outros antes final não faz uma imuutable classe em Java que ele desempenha um papel na estratégia de imutabilidade. Para obter imutabilidade você deve seguir as guidlines gerais:

  • garantir a classe não pode ser substituído - fazer a final classe, ou fábricas estáticas uso e mantê construtores private
  • Faça campos private e final
  • chamadores força para construir um objecto completamente num único passo, em vez de usar um construtor sem argumento combinado com chamadas subsequentes para métodos setXXX (isto é, evitar a feijões convenção Java)
  • não fornecem quaisquer métodos que podem alterar o estado do objeto de qualquer forma - métodos não apenas setXXX, mas qualquer método que pode alterar o estado
  • Se a classe tem quaisquer campos de objeto mutável, então eles devem ser defensivamente copiados quando passou entre a classe e seu chamador

O campo privado não pode ser acessado por métodos substituídos sub de classe ... Então não há nenhuma maneira os métodos sub classe alterar o campo privada de classe super ... Então o que é o uso de fazer a classe imutável como final ?

Palavras-chave finais impede as outras classes em herança. palavra-chave final não significa que seja imutável, mas há tal condição como fazer os membros da classe instância privada, bem final e usando getters e não usar setters

Um classes imutáveis ??finais não pode ser mutado. Aqui abaixo mostra uma classe imutável não final a ser mutado:

// a class not intended to be mutated 
public class GoodClass{

   private String name;

   public GoodClass() {
       this.name = "Good Class Neme";
   }

   public String getName() {
       return name;
   }
}

public class BadClass extends GoodClass {

   private String name;

   public String getName() {
       return name;
   }

   // mutating state
   public void setName(String name) {
       this.name = name;
   }
}



Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top