Почему плохой доступ к статическому методу из нестатического метода? - PullRequest
4 голосов
/ 01 января 2009

Netbeans говорит мне, что плохой доступ к статическому методу из нестатического метода. Почему это плохо? «Доступ к статическому методу getInstance» является предупреждением:

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

}

Ответы [ 7 ]

18 голосов
/ 01 января 2009

Возможно, вы обращаетесь к статическому методу из экземпляра, а не напрямую. Попробуйте использовать Calendar.getInstance() вместо:

private String getSystemTime()
{
    return Calendar.getInstance().get(Calendar.HOUR)+":"+
           Calendar.getInstance().get(Calendar.MINUTE);
}
15 голосов
/ 01 января 2009

Что вы подразумеваете под «вернуть статический метод»? На мой взгляд, нормально вызывать статический метод из метода экземпляра - в зависимости от обстоятельств, конечно. Не могли бы вы опубликовать код, на который жалуется Netbeans?

Одна вещь, которую я мог бы представить, - это если вы используете только статические методы из метода экземпляра, без использования каких-либо данных экземпляра. Иногда это то, что требуется для реализации интерфейса или переопределения метода из базового класса, но если вы ничего не переопределяете и не используете переменные экземпляра, было бы неплохо сделать метод статическим, чтобы показать, что он действительно не зависит от конкретного случая.

РЕДАКТИРОВАТЬ: С отредактированным вопросом это имеет большой смысл. ИМО - это недостаток Java, который позволяет это в первую очередь. Это может сделать для очень вводящего в заблуждение кода. Мой любимый пример (который означает, что старожилы, возможно, уже видели, как я публиковал его раньше :), это с Thread.sleep. Что это выглядит как этот код?

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

На мой взгляд, похоже, что новую ветку просят перевести в спящий режим - похоже на вызов suspend. Но нет - вы можете только попросить текущий выполняющийся поток перевести в спящий режим, поэтому Thread.sleep является статическим методом. Приведенный выше код является допустимой Java и заставит текущий выполняющийся поток спать в течение секунды, пока вновь созданный поток (вероятно) работает ... совсем не так, как выглядит код на первый взгляд.

1 голос
/ 01 января 2009

У вас есть заказ в обратном порядке? Если это так, то имеет смысл, что вы не можете получить доступ к нестатическому методу из статического метода. Если нет, я хотел бы знать, почему это так же плохо!

0 голосов
/ 16 мая 2013

почему просто не объяснить просто:

если вы вызываете нестатический метод, 1) вы создаете новый экземпляр с помощью a = new Class (); 2) затем вызвать метод a.method;

если вы вызываете статический метод: 1) вы называете это Class.method;

Вы можете сделать это с помощью статического метода только потому, что он независим от своего класса и имеет все необходимое для вызова. Если это зависит от какой-то другой информации (как конструктора), вы не объявляете ее статической, это приведет к ошибке.

0 голосов
/ 29 июля 2010

В Java все статические переменные-члены будут загружаться в память первыми, тогда все статические члены будут загружены, после этого нестатические переменные и функции-члены будут загружены в память, после этого будет выполнен статический основной блок ....... так что выдает ошибку, что не ..............

0 голосов
/ 01 января 2009

Это нормально, звонить time.getInstance(). Компилятор посмотрит на тип переменной, Calendar в этом случае, и вызовет метод там. В итоге он компилируется в точности как Calendar.getInstance(). Обратите внимание, что фактическое значение time не способствует этому, то есть оно может быть даже null и не имеет значения.

Это недоверие и отличие от обычных методов, которые осуждаются. Лучше всего выразить это прямо как Calendar.getInstance().

0 голосов
/ 01 января 2009

На нестатический метод нельзя ссылаться из статического контекста. На статические методы можно ссылаться из нестатического контекста.

Это ошибка Netbeans или предупреждение? Можете ли вы опубликовать код, который вызывает его?

...