Métodos Estáticos

Tarde,

O uso de método estático na seguinte situação é valido?

public interface Livro
{
      public static List<Livro> getAllLivros();
}

Interfaces não podem definir métodos estáticos.

(Isso foi uma decisão no projeto da linguagem; se você der uma olhada em http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4093687 vai ver que tem um monte de gente que quer que isso seja possível. )

Na verdade, mesmo se a linguagem permitisse, isso não daria muito certo.

Por exemplo:[code]public interface Foo {
public static void x();
}

class Bar implements Foo {
public static void x() {
System.out.println(“h”);
}
}

class Macko implements Foo {
public static void x() {
System.out.println(“g”);
}
}

class UsaFoo {
public void metodo() {
// Não haveria forma de isso funcionar!
Foo.x();

    // Funcionaria, mas se eu preciso saber qual é a implementação,
    // o que eu ganho com a interface?
    Bar.x();
    Macko.x();
}

}[/code]Por outro lado, ter um método estático na interface sim, seria algo válido se a linguagem permitisse:[code]
public interface Foo {
public static momo() {
System.out.println(“xx”);
}
}

class UsaFoo {
public void metodo() {
Foo.momo();
}
}[/code]

Legal!

Então mudando um pouco:

public class Livro
{
    public static Listi<Livro> getAllLivros()
   {
      return null;
   }
}

Estou fazendo essa pergunta pq eu tenho um professor q insiste que método estático é um referencia a programação Estruturada.
Segundo ele tirando o padrão Singleton, nunca se deve usar métodos estáticos.

[quote=carrijo]Legal!

Então mudando um pouco:

public class Livro
{
    public static Listi<Livro> getAllLivros()
   {
      return null;
   }
}

Estou fazendo essa pergunta pq eu tenho um professor q insiste que método estático é um referencia a programação Estruturada.
Segundo ele tirando o padrão Singleton, nunca se deve usar métodos estáticos.[/quote]

Bem, métodos estáticos não correspondem a conceitos OO.

Há alguns lugares onde você é obrigado a usar, como por exemplo o “public static void main”. O padrão static factory é outro que é recomendável. Mas as vezes são inevitáveis.

Em 1995 o singleton era considerado um belo padrão, mas de uns 5 anos para cá algumas pessoas (inclusive eu) o consideram um problema.
O mesmo ocorreu com a herança de classes, que foi considerada um dos conceitos centrais da OO, mas atualmente muitos a consideram uma das maiores criadoras de problemas na OO.

Há alguns outros lugares em que o estático é recomendado, um exemplo é quando a saída depende unicamente da entrada e polimorfismo não faz sentido, como é o caso de algumas funções matemáticas.

Nunca diga nunca :slight_smile:

Bem, métodos static são mesmo a mesma coisa que as funções/procedimentos de linguagens como C. Só podem trabalhar com parâmetros passados ou com variáveis static “variáveis globais”

o problema de métodos estéticos é que ele deixa o código altamente acoplado.


public class Livro   
{   
    public static Listi<Livro> getAllLivros()   
   {   
      return null;   
   }   
} 

//em outra classe
Livro.getAllLivros();

neste exemplo, o código que estiver usando o método getAllLivros está altamente acoplado a classe Livro.
como o código está altamente acoplado, fica impossível fazer um teste unitário decente.

[quote=carrijo]Legal!

Então mudando um pouco:

public class Livro
{
    public static Listi<Livro> getAllLivros()
   {
      return null;
   }
}

Estou fazendo essa pergunta pq eu tenho um professor q insiste que método estático é um referencia a programação Estruturada.
Segundo ele tirando o padrão Singleton, nunca se deve usar métodos estáticos.[/quote]

Ele tem razão. Usar métodos estáticos é mau em programação OO.
Repare que um método estático não pode ser sobreescrito e isso implica em que é muito dificil testar codigo com métodos estáticos pois não ha como criar strubs ou moks para eles.

Existe uma exceção que são métodos privados utilitários. O tipico método que recebe parametros e cospe alguma coisa.
Se ele for privado e não usar o estado do objeto ele pode ser estático , mas só nesse caso. ( se é privado ele nunca será sobrescrito, portanto não interfere com testes)

A Classe Math do Java so possui metodos estático. Na verdade os métodos devem ser estaticos quando ele fizer algo que não dependa das variaveis de instancia do objeto.
Na minha opiniao, criar um objeto para executar um metodo que poderia ser estatico, é um desperdicio de recurso. E minha opiniao, se eu estiver errado me corrijam… :smiley: