it-swarm-pt.tech

O que significa "contrato" de uma classe?

Eu estou lendo o livro The Java Programming Language . No capítulo que explica overriding method, diz:

Tornar um método override (na subclasse) menos acessível do que era na superclasse violaria o contrato da superclasse ...

O texto como um todo é compreensível. Minha única pergunta é o que é contrato da superclasse ? O que o contract mean para a Java class?

26
Leem.fin

Um contrato em uma classe Java é semelhante a um contrato no mundo real - Em termos não técnicos:

É um acordo que a classe irá expor certos métodos, certas propriedades e certos comportamentos. 

Mais técnico, de aqui : (negrito adicionado por mim) 

Não seria legal se todas as classes Java que você usa, incluindo a sua , cumprissem suas promessas? Na verdade, não seria legal se você realmente soubesse exatamente o que uma determinada classe promete? Se você concordar, leia em [...]

Design por contrato

A técnica de desenvolvimento de software Design by Contract (DBC) garante Software de alta qualidade, garantindo que cada componente de um sistema Atenda às suas expectativas. Como desenvolvedor usando DBC, você especifica contratos de componentes Como parte da interface do componente. O contrato Especifica o que esse componente espera dos clientes e o que os clientes podem Esperar dele.

31
David

Contrato de tipo (classe, interface, enum) é o, bem, o contrato este tipo promete cumprir. Afirma:

  • quais são os parâmetros aceitáveis ​​para o construtor e/ou métodos deste tipo;
  • o que você deve e/ou não deve esperar que este tipo esteja fazendo. Por exemplo, pode indicar que você deve esperar que essa classe seja thread-safe ou não thread-safe;
  • o que são invariantes suportados por este tipo. Por exemplo, digite o método addData(float) da classe MathAverage que calcula a média de sua entrada pode declarar que toda vez que sua chamada para add(float) é retornada, você deve esperar que call para MathAverage.getAverage() retorne a média correta da entrada atual.
  • em geral, seu tipo pode especificar qualquer restrição que todos os subtipos devem seguir. Por exemplo, pode ser que "nenhum método desse tipo demore mais de 1 segundo para ser executado".

Contrato é especificado de forma livre em javadoc do tipo. Existem algumas ferramentas/práticas para impor a execução dos contratos, mas elas são limitadas, exatamente porque o contrato pode ser arbitrário ou, até mesmo, autocontraditório, em caso de erro do programador.

Como a sub-tipagem (subclassificação) pode estender/modificar o comportamento dos métodos de supertipo de maneira arbitrária, ela pode, também, violar algumas partes do contrato do supertipo. Exemplo disso seria estender HashMap, que aceita valores e chaves null, com alguma implementação que proíba valores null em chamadas para seus métodos.

Outro aspecto importante sobre o tipo de contrato é que o subtipo pode ter mais forte contrato (cobrindo o subconjunto de restrições no contrato do tipo), mas não pode ter mais fraco contrato (abrangendo superconjunto de restrições no contrato do tipo). ____.] Por exemplo, se o método do seu tipo 'doX (n)' prometer tomar o tempo O(n) (linear), 'doX (n)' no subtipo pode ter O(1) (constant) time, mas não pode ter O(n^2) time.

5
Victor Sorokin

O "Contrato" de uma classe é a interface pública ou, pelo menos, a interface, se presente em outras classes além da própria.

Isto significa que inclui quaisquer elementos (métodos, campos, construtores, etc.) que outras classes possam usar.

3
cdeszaq

Isso significa que o método que substitui um método em uma classe pai ou interface deve se comportar da maneira que o contrato define.

Caso contrário, o resultado é indefinido.

2
jontro

Há muitos princípios aos quais você deve se conformar quando estiver programando em Java ou em qualquer linguagem de programação. Os princípios dependem da linguagem de programação que você está usando. Você pode saber mais sobre o contrato em Design by contract wikipedia page

0
Mansuro

em termos simples, isso significa que você quebraria as condições da superclasse se tornasse o código de substituição menos acessível

0
sum2000

O contrato de uma classe ou interface, em Java ou qualquer outra linguagem OO, geralmente se refere aos métodos (ou funções) publicamente expostos e propriedades (ou campos ou atributos) dessa interface de classe juntamente com qualquer comentário ou documentação que se aplique a esses métodos e propriedades públicos.

No caso do relacionamento entre uma classe e uma subclasse, quaisquer métodos ou propriedades protegidos seriam considerados "publicamente expostos", no sentido de que estão expostos à subclasse.

0
dgvid

É uma expressão que vem da ideia de contratos no "mundo real". 

Basicamente, se você quebra seu contrato com uma classe, então não é necessário se comportar da maneira esperada. Da outra direção, é uma promessa da classe que se você seguir as regras que ele estabelece, vai se comportar da maneira que sua API diz.

Um exemplo comum de contrato em Java está substituindo equals() quando hashCode() é substituído. Dois objetos considerados iguais devem, por contrato, ter o mesmo código hash. É possível escrever código que esteja sintaticamente correto e que não obedece a isso, mas pode não funcionar corretamente, e isso é culpa do programador que quebrou o contrato.

0
Pops