Pourquoi l'accès à une méthode statique à partir d'une méthode non statique est-il mauvais?

StackOverflow https://stackoverflow.com/questions/405336

  •  03-07-2019
  •  | 
  •  

Question

Netbeans me dit qu’il est mauvais d’accéder à une méthode statique à partir d’une méthode non statique. Pourquoi est-ce mauvais? " Accès à la méthode statique getInstance " est l'avertissement:

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

}

Était-ce utile?

La solution

Vous accédez probablement à la méthode statique à partir d'une instance plutôt que directement. Essayez d’utiliser plutôt Calendar.getInstance () :

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

Autres conseils

Qu'entendez-vous par "retourner une méthode statique"? C'est bien d'appeler une méthode statique à partir d'une méthode d'instance à mon avis - en fonction des circonstances, bien sûr. Pourriez-vous poster du code dont Netbeans se plaint?

Une chose que je pourrais imaginer, c’est que vous n’utilisez que des méthodes statiques à partir d’une méthode d’instance, sans utiliser les données de l’instance. Parfois, c'est ce qui est nécessaire pour implémenter une interface ou redéfinir une méthode à partir d'une classe de base, mais si vous ne redéfinissez rien et que vous n'utilisez aucune variable d'instance, il est agréable de rendre la méthode statique pour montrer que ce n'est vraiment pas le cas. dépendent d'une instance particulière.

EDIT: Avec la question modifiée, cela a beaucoup de sens. OMI c'est une lacune de Java qui le permet en premier lieu. Cela peut rendre le code très trompeur. Mon exemple préféré (ce qui veut dire que les anciens ont peut-être déjà vu le poster :) est avec Thread.sleep . À quoi ressemble-t-il ce ce code?

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

À mon avis, il semble que le nouveau fil de discussion est invité à passer en mode veille, ce qui est similaire à un appel à suspend . Mais non, vous pouvez uniquement demander au thread en cours d'exécution de dormir, c'est pourquoi Thread.sleep est une méthode statique. Le code ci-dessus est légal en Java et rendra le thread en cours d’exécution pendant une seconde tandis que le thread nouvellement créé s’exécutera (probablement) ... pas du tout à quoi ressemble le code à première vue.

Avez-vous l'ordre inversé? Si c'est le cas, il est logique que vous ne puissiez pas accéder à une méthode non statique à partir d'une méthode statique. Sinon, j'aimerais savoir pourquoi c'est aussi mauvais!

Une méthode non statique ne peut pas être référencée à partir d'un contexte statique. Les méthodes statiques peuvent être référencées à partir d'un contexte non statique.

S'agit-il d'une erreur ou d'un avertissement Netbeans? Pouvez-vous poster le code qui le cause?

Il suffit d'appeler time.getInstance () . Le compilateur examinera le type de la variable, Calendar dans ce cas, et appellera la méthode à cet endroit. Il finit par être compilé exactement comme Calendar.getInstance () . Notez que la valeur réelle de time n'y contribue pas, c'est-à-dire qu'elle peut même être null et que cela n'a pas d'importance.

C'est cette indirection et cette différence par rapport aux méthodes habituelles qui sont mal vues. Il est préférable de l'exprimer directement sous Calendar.getInstance () .

pourquoi tout simplement pas expliquer simple:

si vous appelez la méthode non statique, 1) vous créez une nouvelle instance avec a = new Class (); 2) appelez ensuite la méthode a.method;

si vous appelez la méthode statique: 1) vous l'appelez Class.method;

Vous pouvez le faire avec une méthode statique simplement parce qu’elle est indépendante au sein de sa classe et qu’elle a tout ce dont elle a besoin pour appeler. Si cela dépend d'autres informations (en tant que constructeur) si vous ne le déclarez pas statique, cela échouera.

En Java, toutes les variables membres statiques seront chargées en mémoire en premier,   alors tous les membres statiques seront chargés,   après cela, les variables non statiques et les fonctions membres seront chargées en mémoire,   après que le bloc principal statique sera exécuté ....... il donnait donc à l'erreur qu'un non ..............

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top