Pergunta

Quando passar um objecto tipo imutável (string, inteiro, ..) na forma final a um método que pode atingir os caracteres de um ponteiro constante C ++. Mas como posso fazer cumprir tal comportamento em objetos que são mutáveis?

public void someMethod(someType someObject){
 /*
  * code that modifies the someObject's state
  * 
  */
}

Tudo que eu quero é para evitar someMethod de modificar o estado de someObject sem fazer qualquer alteração no SomeType. Isso é possível?

Foi útil?

Solução

Não, eu não acho que isso é possível. A abordagem normal é de criar um adaptador para SomeType onde todos os métodos de alteração do estado lança UnsupportedOperationException. Isto é usado por, por exemplo, java.util.Collections.unmodifiable * -Funções.

Existem várias abordagens para isso:

  • você pode deixar SomeType ser uma interface, e quando você precisar dele para ser somente leitura, basta criar um invólucro delegando todas as lidas-métodos para o objeto original e implementação de todos os write-métodos para lançar uma exceção.
  • ou você pode criar uma subclasse de SomeType substituir todos os métodos de gravação

Isto, claro, apenas dar-lhe tempo de execução verificação, não compiletime. Se você quiser tempo de compilação, você pode deixar SomeType ser uma interface (ou uma superclasse) sem write-métodos, somente leitura.

Outras dicas

No caso geral, não, isso não é possível. Em um caso muito limitado, você pode envolver SomeType em uma classe que oferece a mesma interface (veja Collections.unmodifiableList () para um exemplo).

No entanto, não há equivalente a "passar um ponteiro const eo compilador só irá permitir que você chamar funções const sobre ele".

Não, você não pode impedir que o objeto que está sendo modificado através da sua () (ou similares) métodos setXXX. Você poderia entregar um clone ou uma cópia do mesmo, no entanto.

Não, não é possível. Você tem que quer passar em uma cópia do objeto, ou confiar apenas em saber o que ações fazem mudanças de estado para o objeto e evitar chamá-los -. O compilador não irá ajudá-lo

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