Почему плохой доступ к статическому методу из нестатического метода?

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

  •  03-07-2019
  •  | 
  •  

Вопрос

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

}

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top