Pergunta

O que são boas razões para proibir herança em Java, por exemplo, utilizando as classes finais ou classes usando um único construtor sem parâmetros, privado? Quais são boas razões de fazer uma final método?

Foi útil?

Solução

Seu melhor referência aqui é número 19 do excelente livro de Joshua Bloch "Effective Java", chamada "Projeto e documento de herança ou então proibi-la". (É o item 17 na segunda edição e ponto 15 na primeira edição.) Você realmente deve lê-lo, mas vou resumir.

A interação de classes herdadas com seus pais pode ser surpreendente e imprevisíveis se o ancestral não foi projetado para ser herdada de.

As aulas devem, portanto, vêm em dois tipos:

  1. As classes projetado para ser estendido , e com documentação suficiente para descrever como isso deve ser feito

  2. As classes marcada final

Se você estiver escrevendo código puramente interna este pode ser um pouco de exagero. No entanto, o esforço extra envolvido na adição de cinco caracteres para um arquivo de classe é muito pequena. Se você estiver escrevendo apenas para Consumo interno, em seguida, um futuro programador pode sempre remover a 'final' -. Você pode pensar nisso como um aviso dizendo "esta classe não foi projetado com herança em mente"

Outras dicas

Você pode querer fazer uma tão último método que as classes imperativas não pode mudar o comportamento que é contar em outros métodos. Métodos chamados em construtores muitas vezes são declarados finais para que você não receberá nenhuma surpresa desagradável ao criar objetos.

Uma das razões para fazer uma final classe seria se você quisesse forçar composição sobre herança. Este é geralmente desejável para evitar acoplamento forte entre as classes.

Existem 3 casos de uso, onde você pode ir para métodos final.

  1. Para evitar classe derivada de substituir uma funcionalidade classe de base em particular.
  2. Isto é para fins de segurança, onde a classe base está dando algumas funcionalidades núcleo importante do quadro onde a classe derivada não é suposto para mudá-lo.
  3. métodos finais são mais rápidos do que os métodos de instância, já que não há uso do conceito de tabela virtual para métodos final e privadas. Então, onde já existe a possibilidade, tente usar métodos final.

Purpose para a tomada de uma classe final:

Assim que nenhum corpo pode estender essas classes e mudar seu comportamento.

Por exemplo: Wrapper classe Integer é uma classe final. Se essa classe não é final, então qualquer um pode estender Integer em sua própria classe e mudar o comportamento básico da classe inteiro. Para evitar isso, java fez todas as classes de mensagens publicitárias como classes finais.

Você pode querer fazer objetos imutáveis ??( http://en.wikipedia.org/wiki/Immutable_object ), você pode querer criar um singleton ( http://en.wikipedia.org/wiki/ Singleton_pattern), ou você pode querer impedir que alguém substituindo o método por razões de eficácia, segurança ou de segurança.

A herança é como uma serra elétrica - muito poderoso, mas terrível nas mãos erradas. Ou você projetar uma classe para ser herdada de (o que pode limitar a flexibilidade e levar muito mais tempo) ou você deve proibi-la.

Veja Effective Java 2ª edição itens 16 e 17, ou meu blog " imposto sobre herança ".

Hmmm ... Eu posso pensar em duas coisas:

Você pode ter uma classe que lida com certas questões de segurança. Por subclasse-lo e alimentar o seu sistema a versão subclasse dela, um atacante pode contornar restrições de segurança. Por exemplo. seu aplicativo pode suportar plugins e se um plugin pode apenas subclasse seus segurança classes relevantes, pode usar esse truque para de alguma forma contrabandear uma versão subclasse dela no lugar. No entanto, este é sim algo Sun tem de lidar com respeito applets e similares, talvez não um caso tão realista.

Um muito mais realista é para evitar um objeto se torna mutável. Por exemplo. desde strings são imutáveis, seu código pode manter com segurança as referências a ele

 String blah = someOtherString;

em vez de copiar a cadeia primeiro. No entanto, se você pode subclasse String, você pode adicionar métodos a ele que permitem que o valor da cadeia para ser modificado, agora nenhum código pode confiar mais que a corda vai ficar na mesma, se ele apenas copia a string como acima, em vez disso, deve duplicar o string.

Para impedir as pessoas de fazer coisas que poderiam confundir-se e outros. Imagine uma biblioteca de física onde você tem algumas constantes ou cálculos definidos. Sem usar a palavra-chave final, alguém pode vir e redefinir cálculos básicos ou constantes que nunca deveria mudar.

Além disso, se você estiver escrevendo uma classe de código fechado comercial, você pode não querer que as pessoas sejam capazes de alterar a funcionalidade para baixo da linha, especialmente se u precisa dar suporte para ele e as pessoas têm substituído o seu método e estão reclamando que chamando dá resultados inesperados.

Se você marcar classes e métodos como final, você pode perceber um ganho de desempenho pequeno, uma vez que o tempo de execução não tem que procurar o método de classe direito de invocar para um determinado objeto. métodos não-finais estão marcadas como tão virtual que eles possam ser devidamente prorrogado, se necessário, métodos final pode ser diretamente ligado ou compilado em linha na classe.

Você quer fazer uma tão última método que substituir as classes não mudar seu comportamento. Quando você quer ser capaz de mudar o comportamento fazer o público método. Quando você substituir um método público que pode ser alterado.

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