Em uma classe Java, um método pode ser definido para ser final
, para marcar que esse método não pode ser substituído:
public class Thingy {
public Thingy() { ... }
public int operationA() {...}
/** this method does @return That and is final. */
public final int getThat() { ...}
}
Isso é claro e pode ser útil para proteger contra a substituição acidental ou talvez o desempenho - mas essa não é a minha pergunta.
Minha pergunta é: Do ponto de vista do POO, entendi que, ao definir um método, final
o designer da classe promete que esse método sempre funcionará como descrito ou implícito. Mas muitas vezes isso pode estar fora da influência do autor da classe, se o que o método está fazendo é mais complicado do que apenas entregar uma propriedade .
A restrição sintática é clara para mim, mas qual é a implicação no sentido de POO? É final
usado corretamente nesse sentido pela maioria dos autores de classe?
Que tipo de "contrato" final
promete um método?
Primeiro, você pode marcar classes não abstratas
final
, além de campos e métodos. Dessa forma, toda a classe não pode ser subclassificada. Portanto, o comportamento da classe será corrigido.Concordo que os métodos de marcação
final
não garantem que seu comportamento será o mesmo nas subclasses se esses métodos estiverem chamando métodos não finais. Se o comportamento realmente precisa ser corrigido, isso deve ser alcançado por convenção e design cuidadoso. E não se esqueça de fazer isso no javadoc! (Documentação em java)Por último, mas não menos importante, a
final
palavra-chave tem um papel muito importante no Java Memory Model (JMM). É garantido pelo JMM que, para obter visibilidade dosfinal
campos, você não precisa de sincronização adequada. Por exemplo:fonte
String
, mas nas classes definidas pelo usuário). Mas o que você disse sobre "final não garante o comportamento" é exatamente o meu ponto. Concordo, doc e design são importantes.final
não garantirá a visibilidade das alterações feitas nos objetos compostos, comoMap
.Não tenho certeza de que você possa fazer afirmações sobre o uso de "final" e como isso afeta o contrato geral de design do software. Você tem a garantia de que nenhum desenvolvedor pode substituir esse método e anular seu contrato dessa maneira. Mas, por outro lado, o método final pode depender de variáveis de classe ou instância cujos valores são definidos por subclasses e pode chamar outros métodos de classe que são substituídos. Portanto, final é, no máximo, uma garantia muito fraca.
fonte
const
. Como emchar const * const = "Hello"
ouchar const * const addName(char const * const name) const
...Não, não está fora da influência do autor da classe. Você não pode substituí-lo em sua classe derivada; portanto, ele fará o que o autor da classe base pretendia.
http://download.oracle.com/javase/tutorial/java/IandI/final.html
É importante notar que é a parte em que sugere que os métodos chamados pelos construtores deveriam ser
final
.fonte