Pergunta

O NetBeans me diz que é ruim para o acesso de um método estático de um método não estático. Por que isso é ruim? "Acessando método estático getInstance" é o aviso:

import java.util.Calendar;

public class Clock
{
    // Instance fields
    private Calendar time;

    /**
     * Constructor. Starts the clock at the current operating system time
     */
    public Clock()
    {
        System.out.println(getSystemTime());
    }

    private String getSystemTime()
    {
        return this.time.getInstance().get(Calendar.HOUR)+":"+
                this.time.getInstance().get(Calendar.MINUTE);
   }

}

Foi útil?

Solução

Você provavelmente acessando o método estático de uma instância em vez de diretamente. Tente usar Calendar.getInstance() vez:

private String getSystemTime()
{
    return Calendar.getInstance().get(Calendar.HOUR)+":"+
           Calendar.getInstance().get(Calendar.MINUTE);
}

Outras dicas

O que você quer dizer com "retornar um método estático"? É bom para chamar um método estático de um método de instância na minha opinião - dependendo das circunstâncias, é claro. Você poderia postar algum código que Netbeans reclama?

Uma coisa que eu pode imaginar é se você usar apenas métodos estáticos de um método de instância, sem o uso de qualquer um dos dados da instância. Às vezes isso é o que é necessário para implementar uma interface ou substituir um método de uma classe base, mas se você não está substituindo qualquer coisa e você não está usando quaisquer variáveis ??de instância, é bom para tornar o método estático para mostrar que ele realmente não faz depender de uma instância particular.

EDIT: Com a questão editado, isso faz muito sentido. IMO é uma deficiência em Java que permite que ele, em primeiro lugar. Ele pode fazer por muito enganosa código. Meu exemplo favorito (o que significa que os veteranos podem muito bem ter me visto postá-lo antes :) é com Thread.sleep. O que não é olhar como este código faz?

Thread t = new Thread(someRunnable);
t.start();
t.sleep(1000);

Para mim, parece que o novo segmento é convidado a dormir - semelhante a uma chamada para suspend. Mas não - você só pode pedir a thread atualmente em execução para dormir, e é por isso Thread.sleep é um método estático. O código acima é Java legal, e fará com que o sono thread atualmente em execução por um segundo enquanto o segmento recém-criado (provavelmente) corre ... não em tudo o que os olhares de código, como à primeira vista.

Você tem a ordem inversa? Se assim for, não faz sentido que você não pode acessar um método não-estático de um método estático. Se não, eu gostaria de saber por que isso é assim tão mau!

Um método não-estático não pode ser referenciado a partir de um contexto estático. Os métodos estáticos pode ser referenciado a partir de um contexto não estático.

É um erro Netbeans ou aviso? Pode você código postal que está causando isso?

É muito bem para time.getInstance() chamada. O compilador irá olhar para o tipo da variável, Calendar neste caso, e chamar o método lá. Ele acaba sendo compilado exatamente como Calendar.getInstance(). Note-se que o valor real do time não contribui para isso, ou seja, ele pode até mesmo ser null e não importa.

É este engano ea diferença de métodos regulares que é desaprovada. É melhor para expressá-la diretamente como Calendar.getInstance().

Por que apenas não explicam simples:

Se você chamar o método não estático, 1) você cria nova instância com a = new Class (); 2) método, então chamada a.method;

Se você chamar o método estático: 1) você chamá-lo Class.method;

Você pode fazê-lo com método estático só porque ele é independente dentro de sua classe e tem tudo o que precisa para chamar. Se depender de algumas outras informações (como construtor) você não declará-lo estático, ele irá falhar.

Em java todas as variáveis ??de membro estático será carregado na memória em primeiro lugar, em seguida, todos os membros estáticos será carregado, depois que as variáveis ??não-estáticas e funções membro será carregado na memória, depois disso bloco principal estático será executado ....... por isso estava dando o erro que um não ..............

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