Eu pesquisei o tópico, mas além da Wikipedia não encontrei nenhuma documentação ou artigo útil.
Alguém pode me explicar em palavras simples o que significa ou indicar alguma documentação agradável e fácil de entender?
Eu pesquisei o tópico, mas além da Wikipedia não encontrei nenhuma documentação ou artigo útil.
Alguém pode me explicar em palavras simples o que significa ou indicar alguma documentação agradável e fácil de entender?
Respostas:
Isso não significa nada em particular em referência a java.
Uma invariante de classe é simplesmente uma propriedade válida para todas as instâncias de uma classe, sempre, não importa o que outro código faça.
Por exemplo,
class X {
final Y y = new Y();
}
X tem a classe invariante de que existe uma y
propriedade e nunca é null
e tem um valor de tipo Y
.
class Counter {
private int x;
public int count() { return x++; }
}
falha em manter dois invariantes importantes
count
nunca retorna um valor negativo devido a um possível estouro negativo.count
estão aumentando estritamente monotonicamente.A classe modificada preserva essas duas invariantes.
class Counter {
private int x;
public synchronized int count() {
if (x == Integer.MAX_VALUE) { throw new IllegalStateException(); }
return x++;
}
}
mas falha em preservar o invariante que chama para count
sempre ter sucesso normalmente (violações de TCB ausentes † ) porque count
pode lançar uma exceção ou pode bloquear se um thread em conflito possuir o monitor do contador.
Cada linguagem com classes torna mais fácil manter algumas invariantes de classe, mas não outras. Java não é exceção:
private
campos, portanto, invariantes que dependem de dados privados são fáceis de manter.null
valores se infiltrem de várias maneiras, por isso é difícil manter invariantes "tem um valor real".† - Uma externalidade ou violação de TCB é um evento que um projetista de sistemas assume, de maneira otimista, que não acontecerá.
Normalmente, apenas confiamos que o hardware básico funciona conforme anunciado quando falamos sobre propriedades de linguagens de alto nível construídas sobre eles, e nossos argumentos que as invariantes mantêm não levam em consideração a possibilidade de:
setAccessible
para modificar private
tabelas de pesquisa.Para alguns sistemas, nosso TCB pode incluir apenas partes do sistema, portanto, não podemos assumir que
mas podemos supor que
Quanto mais alto nível um sistema, maior normalmente é seu TCB, mas quanto mais coisas não confiáveis você pode obter de seu TCB, mais provável é que suas invariantes sejam retidas e mais confiável seu sistema será a longo prazo.
count
nunca retorna o mesmo valor duas vezes" realmente considerado uma invariante de classe?
Invariante significa algo que deve obedecer às suas condições, independentemente das alterações ou de quem o usa / transforma. Ou seja, uma propriedade de uma classe sempre cumpre ou satisfaz alguma condição, mesmo depois de passar por transformações usando métodos públicos. Assim, o cliente ou usuário desta classe está assegurado sobre a classe e sua propriedade.
Por exemplo,
Eles são fatos que devem ser verdadeiros sobre uma classe de instância. Por exemplo, se uma classe tem uma propriedade X e invariante pode ser X deve ser maior que 0. Pelo que eu sei, não há nenhum método embutido para manter invariáveis, você deve tornar as propriedades privadas e certificar-se de que seus getters e setters cumpram a propriedade de invariância.
Existem anotações disponíveis que podem verificar as propriedades usando reflexão e interceptores. http://docs.oracle.com/javaee/7/api/javax/validation/constraints/package-summary.html