Pregunta

Netbeans me dice que es malo acceder a un método estático desde un método no estático. ¿Por qué es esto malo? " Accediendo al método estático getInstance " es la advertencia:

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);
   }

}

¿Fue útil?

Solución

Probablemente esté accediendo al método estático desde una instancia en lugar de hacerlo directamente. Intente usar Calendar.getInstance () en su lugar:

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

Otros consejos

¿Qué quieres decir con " devolver un método estático " ;? Está bien llamar a un método estático desde un método de instancia desde mi punto de vista, dependiendo de las circunstancias, por supuesto. ¿Podrías publicar algún código del que se quejan los Netbeans?

Una cosa que podría imaginar es si solo usas métodos estáticos de un método de instancia, sin usar ninguno de los datos de la instancia. A veces, eso es lo que se requiere para implementar una interfaz o anular un método de una clase base, pero si no está anulando nada y no está utilizando ninguna variable de instancia, es bueno hacer que el método sea estático para mostrar que realmente no es así. Depende de una instancia en particular.

EDITAR: Con la pregunta editada, esto tiene mucho sentido. OMI es una deficiencia en Java que lo permite en primer lugar. Se puede hacer para el código muy engañoso. Mi ejemplo favorito (lo que significa que los veteranos pueden haberme visto publicarlo antes :) es con Thread.sleep . ¿Qué aspecto tiene de este código?

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

En mi opinión, parece que se le pide al nuevo hilo que esté en reposo, similar a una llamada a suspender . Pero no, solo puede pedir que el subproceso que se está ejecutando actualmente esté en suspensión, por lo que Thread.sleep es un método estático. El código anterior es Java legal, y hará que el subproceso que se está ejecutando se duerma durante un segundo, mientras que el subproceso recién creado (probablemente) se ejecuta ... no es en absoluto lo que parece el código a primera vista.

¿Tiene el orden invertido? Si es así, tiene sentido que no pueda acceder a un método no estático desde un método estático. Si no, me gustaría saber por qué esto también es malo.

No se puede hacer referencia a un método no estático desde un contexto estático. Los métodos estáticos se pueden referenciar desde un contexto no estático.

¿Es un error o advertencia de Netbeans? ¿Puedes publicar el código que lo está causando?

Está bien llamar a time.getInstance () . El compilador observará el tipo de variable, Calendar en este caso, y llamará al método allí. Termina siendo compilado exactamente como Calendar.getInstance () . Tenga en cuenta que el valor real de tiempo no contribuye a esto, es decir, incluso puede ser nulo y no importa.

Es esta indirección y diferencia de los métodos regulares que está mal vista. Es mejor expresarlo directamente como Calendar.getInstance () .

por qué simplemente no se explica simple:

si llamas método no estático, 1) creas una nueva instancia con a = new Class (); 2) luego llame al método a.method;

si llamas método estático: 1) lo llamas Class.method;

Puede hacerlo con un método estático solo porque es independiente dentro de su clase y tiene todo lo que necesita para llamar. Si depende de alguna otra información (como constructor) no la declaras estática, fallará.

En java, todas las variables miembro estáticas se cargarán primero en la memoria,   entonces todos los miembros estáticos serán cargados,   después de eso, las variables y las funciones miembro no estáticas se cargarán en la memoria,   después se ejecutará el bloque principal estático ....... por lo que fue dando el error que un no ..............

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top