[final em métodos] - Motivos obscuros em usa-los?

Oi,

Todas as classes do projeto que estou trabalhando foram revisadas. Observei que o revisor acrescentou a quase todos os métodos o termo public final void.

Usar final em variáveis locais, ou na passagem de parâmetros tudo bem. Agora em métodos? Até onde eu sei, o final em métodos só servem para que um método da superclass não possa ser sobrescrito na classe filha. Não é?

Será que tem alguma coisa obscura nisso?

Tchauzin!

[quote=lina]Oi,

Todas as classes do projeto que estou trabalhando foram revisadas. Observei que o revisor acrescentou a quase todos os métodos o termo public final void.

Usar final em variáveis locais, ou na passagem de parâmetros tudo bem. Agora em métodos? Até onde eu sei, o final em métodos só servem para que um método da superclass não possa ser sobrescrito na classe filha. Não é?

Será que tem alguma coisa obscura nisso?

Tchauzin![/quote]

Oi lina.

Acredito que não há nada de obscuro, mas que o revisor tenha feito isso justamente para não permitir que alguém altere o comportamento de determinadas classes/métodos. Todavia, é raro eu utilizar desse modificador para métodos, para não tirar a opção de sobrescrita de classes filhas, até porque 90% desenvolvo voltado a interfaces, mas tudo bem.

Você tem acesso a esse revisor ? Talvez fosse o caso de conversar com ele e perguntar porque tantos métodos receberam este modificador.

[quote=nel][quote=lina]Oi,

Todas as classes do projeto que estou trabalhando foram revisadas. Observei que o revisor acrescentou a quase todos os métodos o termo public final void.

Usar final em variáveis locais, ou na passagem de parâmetros tudo bem. Agora em métodos? Até onde eu sei, o final em métodos só servem para que um método da superclass não possa ser sobrescrito na classe filha. Não é?

Será que tem alguma coisa obscura nisso?

Tchauzin![/quote]

Oi lina.

Acredito que não há nada de obscuro, mas que o revisor tenha feito isso justamente para não permitir que alguém altere o comportamento de determinadas classes/métodos. Todavia, é raro eu utilizar desse modificador para métodos, para não tirar a opção de sobrescrita de classes filhas, até porque 90% desenvolvo voltado a interfaces, mas tudo bem.

Você tem acesso a esse revisor ? Talvez fosse o caso de conversar com ele e perguntar porque tantos métodos receberam este modificador.[/quote]

Oi,

Pois é. Imaginei. Ele ainda não chegou. Quero ver a resposta dele quando eu perguntar! rsrs

Tchauzin!

Provavelmente o revisor deve ter visto que esse é uma recomendação do CheckStyle ou do PMD e não questionou os motivos.

Em particular eu acho isso péssimo, porque usar “final” não acelera o funcionamento do sistema (esse era um mito que havia a respeito do Java), e dificulta alguma correção de especificação que possa ser feita através de herança.

[quote=lina][quote=nel][quote=lina]Oi,

Todas as classes do projeto que estou trabalhando foram revisadas. Observei que o revisor acrescentou a quase todos os métodos o termo public final void.

Usar final em variáveis locais, ou na passagem de parâmetros tudo bem. Agora em métodos? Até onde eu sei, o final em métodos só servem para que um método da superclass não possa ser sobrescrito na classe filha. Não é?

Será que tem alguma coisa obscura nisso?

Tchauzin![/quote]

Oi lina.

Acredito que não há nada de obscuro, mas que o revisor tenha feito isso justamente para não permitir que alguém altere o comportamento de determinadas classes/métodos. Todavia, é raro eu utilizar desse modificador para métodos, para não tirar a opção de sobrescrita de classes filhas, até porque 90% desenvolvo voltado a interfaces, mas tudo bem.

Você tem acesso a esse revisor ? Talvez fosse o caso de conversar com ele e perguntar porque tantos métodos receberam este modificador.[/quote]

Oi,

Pois é. Imaginei. Ele ainda não chegou. Quero ver a resposta dele quando eu perguntar! rsrs

Tchauzin![/quote]

rs. É claro que não conheço o sistema em questão, mas não vejo motivos para usar isso “em massa”. As vezes, podemos utilizar “uma vez ou outra”, mas em grande quantidades torna-se bastante questionável a ação. Não esqueça de postar a resposta dele rs.

[quote=entanglement]Provavelmente o revisor deve ter visto que esse é uma recomendação do CheckStyle ou do PMD e não questionou os motivos.

Em particular eu acho isso péssimo, porque usar “final” não acelera o funcionamento do sistema (esse era um mito que havia a respeito do Java), e dificulta alguma correção de especificação que possa ser feita através de herança.[/quote]

Concordo. É no mínimo crítico.

É, essa linha já disse tudo, já vi muita coisa “estranha” em código por causa de CheckStyle e PMD.

Exemplo de coisas bizarras que as pessoas fazem em código por causa do CheckStyle e PMD.

Digamos que você tenha uma classe que tenha um monte de imports (isso costuma ocorrer muito porque normalmente você importa um monte de DAOs, por exemplo).

O problema é que alguém do cliente estipulou que o número de imports deveria ser no máximo X (onde X era um número indecentemente baixo).

Conclusão? Para evitar isso, as hierarquias de classes começaram a ficar muito profundas, porque você acabava tendo de contornar o problema implementando apenas alguns métodos em cada subclasse, para evitar que fossem importadas muitas classes.

Eu preferiria que as hierarquias ficassem mais rasas e que não se restringisse o número de imports. Mesmo estipular um número X muito grande vai acabar dando esse mesmo problema.

Encontrei em minha empresa alguns padrões de desenvolvimento que foram impostos e simplismente retiram o potencial da programação orientada a objetos, esse seu caso é extremista pois define final nos metodos. Tenho a esperença de um dia encontrar especificadores de padroes que conheçam o potencial da orientação a objetos sobre java. Espero que o bom senso seja levado em conta pois há casos e casos.

por muito tempo achava-se que isso melhoraria performance das aplicações, mas é mito. Provavelmente é um “arquiteto” a moda antiga. :smiley:

Oi,

Segue a justificativa:

Foi colocado o final para garantir que o método não é estendido. Para quando visualizar a classe saber que aquele método não é estendido de nenhuma classe.

Tchauzin!

[quote=lina]Oi,

Segue a justificativa:

Foi colocado o final para garantir que o método não é estendido. Para quando visualizar a classe saber que aquele método não é estendido de nenhuma classe.

Tchauzin![/quote]

Não é estendido de nenhuma classe? não entendi.

Eu não posso sobrescrever um método e marcá-lo como final ?

Oi,

Na verdade foi uma padronização adotada por ele. A partir de agora todo o método deverá ser criado como final e caso necessite sobrescreve-lo na classe filha, deve-se tirar essa propriedade.

Tchauzin!

[quote=lina]Oi,

Na verdade foi uma padronização adotada por ele. A partir de agora todo o método deverá ser criado como final e caso necessite sobrescreve-lo na classe filha, deve-se tirar essa propriedade.

Tchauzin![/quote]

Não era para ser ao contrário ? Na realidade, não era para ser feita uma análise e caso o comportamento do método não pudesse ser alterado, por exemplo, usufruir desse recurso? Não concordei muito com isso. Mas como me disseram uma vez, “nem sempre tu fará aquilo que quer e/ou concorda, as vezes fazemos o que não queremos simplesmente porque nos ‘mandaram’ fazer”.

É por ai né…