Como obter um c ++ constante ponteiro equivalente em Java?
-
22-08-2019 - |
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?
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