É vantagem usar static e final? [RESOLVIDO]  XML
Índice dos Fóruns » Java Básico
Autor Mensagem
wellington7
JavaEvangelist
[Avatar]

Membro desde: 16/03/2007 14:03:02
Mensagens: 333
Offline

É vantagem eu sair colocando static e final em todos o métodos e atributos que aceitarem esses modificadores?
Eu tenho ganho de desempenho considerável utilizando muito algum desses dois?

"Faça por onde que eu te ajudarei"

Idéias que você deveria conhecer:
  • Lombok
  • SSCCE
  • peerless
    GUJ Master
    [Avatar]

    Membro desde: 22/01/2007 14:52:26
    Mensagens: 1391
    Localização: Porto Alegre / RS
    Offline

    não é vantagem, uma vez que você precise trabalhar com mais de uma instancia para cada objeto...


    follow me
    pitacos

    "The most problems that teams face are about communication, and all the others are too." - Dan North





    [MSN]
    ViniGodoy
    Moderador
    [Avatar]

    Membro desde: 11/12/2006 08:22:01
    Mensagens: 20580
    Localização: Curitiba/PR
    Offline

    O static e final em conjunto deve ser usado apenas para constantes.

    Dê sempre preferência ao projeto de suas classes e a um código claro, ao invés da performance. Classes bem projetadas podem ser facilmente otimizadas, enquanto as mal projetadas, não.

    Quando for otimizar seu código, use um profiler para identificar os pontos com problema e otimize somente esses lugares. Deixe o código otimizado documentado, explicando o motivo da otimização e os ganhos com seu novo algoritmo, assim você não corre o risco de alguém desfazer o código da otimização por engano.

    O compilador faz um trabalho muito bom com otimizações. Como já foi demonstrado com o C++, não é necessário dar dicas a ele com a palavra final e ele geralmente fará um trabalho muito melhor do que você nesse sentido. Do contrário do C++, o java é capaz de analisar o código em tempo de execução e fazer inline de métodos on the fly.

    Para mais informações, dê uma lida nos artigos, do Brian Goetz:
    Java theory and practice: Is that your final answer?
    Java theory and practice: Urban performance legends

    Você terá ganho significativo de performance escolhendo algoritmos eficientes e usando bem a API do java (que já tem algoritmos assim prontos). Por exemplo, se você ainda ordena uma lista com Bubble sort, ao invés de simplesmente chamar Collections.sort (que usa um QuickSort modificado), certamente terá aplicações de performance baixa.
    [WWW]
    Dieval Guizelini
    Virtual Machine Man
    [Avatar]

    Membro desde: 05/07/2006 14:39:44
    Mensagens: 570
    Localização: Curitiba - PR
    Offline

    Vale a pena dar uma olhada neste endereços:

    static
    http://www.javapractices.com/Topic2.cjp
    http://www.javapractices.com/Topic195.cjp

    final
    http://www.javapractices.com/Topic23.cjp

    fw

    Sun Certified Java Programmer 5.0
    [WWW]
    thingol
    Moderador

    Membro desde: 29/07/2004 16:10:13
    Mensagens: 17543
    Offline

    Uma coisa que é interessante é usar "final" para parâmetros e variáveis locais inicializadas.
    Isso normalmente evita alguns erros bobos de programação que ocorrem porque a gente sempre esquece que parâmetros são passados por valor, não por referência.

    Exemplo: por que este código não funciona como desejado?

    Se você passar os parâmetros para "final", vai ver por que é que não funciona:

    [WWW]
    LPJava
    GUJ Hacker

    Membro desde: 18/04/2006 12:50:23
    Mensagens: 5524
    Localização: Bahia/Porto Alegre
    Offline

    wellington7 wrote:É vantagem eu sair colocando static e final em todos o métodos e atributos que aceitarem esses modificadores?
    Eu tenho ganho de desempenho considerável utilizando muito algum desses dois?


    cara existe uma grande diferença entre o static e o final, o static diz que q seu metodo pertence a class e q so pode ser chamado por outro metodo static.. agora o final diz o seguinte.. que seu metodo jamais vai subscrito em sua subclasse... um metodo final ele nao eh herdado uma class final ele nao eh herdado o metodo static tb nao eh herdado mais pode ser redefinido.. em uma subclass...



    Sun Certified Java Programmer 5.0
    Blog:http://www.camilolopes.com
    Twitter:www.twitter.com/camilolope
    Linkedin: http://br.linkedin.com/in/camilolopes
    Curso online OCPJP: http://pro.imasters.com.br/online/cursos/preparatorio-para-certificacao-java-ocjp
    Autor livro Guia SCJP & JEE c/ Frameworks: http://blog.camilolopes.com.br/livrosrevistaspalestras/
    [WWW]
    wellington7
    JavaEvangelist
    [Avatar]

    Membro desde: 16/03/2007 14:03:02
    Mensagens: 333
    Offline

    Vamos ver se entendi..
    "final" não é bom para métodos, pois impede que o Java possa fazer sua própria otimização (que seria muito melhor do q a minha).
    Mas "final" é muito bom para os atributos e variaveis locais, para impedir que se modifique o valor (quando não se desejar modificar esse valor..)

    E o "static" (como estou usando) é muito legal pra atributos ou métodos que se quer acessar sem criar uma instancia da classe. Eu por exemplo estou criando desenhos em celulas da jTable, a classe Desenho tem todos os desenhos como static, eu acesso Desenho.fig1() e ele já desenha, de qualquer parte do programa.

    Em outras palavras:
    Static = Acesso global, sem necessidade de instancia.
    Final = Contante. Na maioria, bom apenas para atributos locais.

    Qualquer coisa me corrijam.

    Valeu!

    "Faça por onde que eu te ajudarei"

    Idéias que você deveria conhecer:
  • Lombok
  • SSCCE
  • pcalcado
    Moderador
    [Avatar]

    Membro desde: 08/03/2004 17:19:35
    Mensagens: 5174
    Localização: Sydney - Australia
    Offline

    Como um adendo, se você quer seguir boas práticas de OOP deve marcar como final todos os métodos que não vai dar suporte. Ou seja: se sua classe não está preparada para trabalhar com uma versão polimórfica de um dado método faça-o final.

    Phillip Calçado "Shoes"
    http://fragmental.tw/
    http://blog.fragmental.com.br/
    "It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay
    [Email] [WWW] [Yahoo!] [MSN]
    Rafael Nunes
    Moderador
    [Avatar]

    Membro desde: 09/10/2003 13:41:06
    Mensagens: 2890
    Localização: sao bernardo do campo
    Offline

    thingol wrote:
    Exemplo: por que este código não funciona como desejado?




    Creio que não entendi bem o exemplo, o que exatamente ele deveria realizar que não está realizando?
    [Email]
    seufagner
    JavaEvangelist
    [Avatar]

    Membro desde: 06/05/2005 16:33:09
    Mensagens: 447
    Localização: Rio de Janeiro - RJ
    Offline

    Também estou bastante curioso. rsrs

    @seufagner
    seufagner.com.br
    "Simplicidade é a maior forma de sofisticação"
    Leonardo Da vinci
    [Email] [WWW]
    romulolara
    Smalltalk

    Membro desde: 13/11/2006 18:29:54
    Mensagens: 4
    Offline

    Abusar de Static nunca é uma boa prática em OO... Tem que se usada nos casos específicos, pois se todos os métodos e classes tivessem static seria como programar em procedural!!
    urubatan
    Moderador
    [Avatar]

    Membro desde: 21/09/2002 10:31:26
    Mensagens: 2481
    Localização: Porto Alegre/RS
    Offline

    tenha pro regra o seguinte, o único método estático da aplicação é o public static void main

    para ter qualquer outro método static tu precisa de um ótimo motivo

    []'s
    Rodrigo Urubatan
    http://www.urubatan.com.br
    Melhor livro de RoR do brasil: http://livro.urubatan.com.br
    [WWW]
    ViniGodoy
    Moderador
    [Avatar]

    Membro desde: 11/12/2006 08:22:01
    Mensagens: 20580
    Localização: Curitiba/PR
    Offline

    Rafael Nunes wrote:
    Creio que não entendi bem o exemplo, o que exatamente ele deveria realizar que não está realizando?


    O código do Thingol deveria trocar o valor dois dois Strings, mas ele não faz isso. Isso porque a função receberá 2 referências para as strings, mas elas são simplesmente cópias das referências originais.

    Assim, alterar o valor dentro da função não refletirá em nada fora da função.
    [WWW]
    ViniGodoy
    Moderador
    [Avatar]

    Membro desde: 11/12/2006 08:22:01
    Mensagens: 20580
    Localização: Curitiba/PR
    Offline

    Em resumo da ópera:

    Use static e final apenas quando isso se refletir ou reforçar uma decisão de projeto, nunca por motivos como performance.

    Os modificadores static e final foram criados com um motivo específico e é esse motivo que deve ser levado em conta no momento de utiliza-los.
    [WWW]
    cv
    Moderador
    [Avatar]

    Membro desde: 04/04/2003 00:32:12
    Mensagens: 7842
    Localização: São Paulo, SP
    Offline

    pcalcado wrote:Como um adendo, se você quer seguir boas práticas de OOP deve marcar como final todos os métodos que não vai dar suporte. Ou seja: se sua classe não está preparada para trabalhar com uma versão polimórfica de um dado método faça-o final.


    Pra que?
    [Email] [WWW] [Yahoo!] [MSN] [ICQ]
     
    Índice dos Fóruns » Java Básico
    Ir para:   
    Powered by JForum 2.1.8 © JForum Team