Почему предпочтительно назвать статический метод статически из экземпляра класса метода?

Если я создаю экземпляр класса в Java, почему предпочтительно назвать статический метод того же самого класса статически, вместо того, чтобы использовать this.method ()?

Я получаю предупреждение от Eclipse, когда я пытаюсь назвать статический метод staticMethod () из конструктора пользовательского класса через this.staticMethod ().

public MyClass() { this.staticMethod(); }

по сравнению с

public MyClass() { MyClass.staticMethod(); }

Кто-либо может объяснить, почему это - плохая вещь сделать? Это кажется мне как компилятор, должен был уже выделить экземпляр объекта, таким образом, статически выделение памяти было бы ненужное служебный.

Править:

Суть того, что я слышу, - то, что это - плохая практика главным образом из-за удобочитаемости, и понятно так. То, что я действительно пытался спросить (хотя не очень ясно) было тем, что различия там при 'компиляции', если таковые имеются, между вызовом MyClass.staticMethod () или this.staticMethod ().

5
задан javanix 23 April 2010 в 09:30
поделиться

5 ответов

MyClass.staticMethod () дает понять, что вы вызываете статический (непереопределяемый) метод.

this.staticMethod () вводит читателя в заблуждение, заставляя думать, что это метод экземпляра.

staticMethod () также вводит в заблуждение (хотя я обычно так и поступаю).

Если вы думаете, что люди, читающие ваш код, незнакомы с ним, вы, как правило, пытаетесь сделать код более ясным, и это тот случай, когда код становится более понятным, если вместо instance.method используется ClassName.method.

6
ответ дан 18 December 2019 в 06:02
поделиться

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

В приведенном ниже коде не совсем очевидно, что b.test () вернет «A», если вы ожидаете полиморфизма нестатического метода:

public class TestStaticOverride
{
  public static void main( String[] args )
  {
    A b = new B();
    System.out.println( "Calling b.test(): " + b.test() );
  }

  private static class A
  {
    public static String test() { return "A"; }
  }

  private static class B extends A
  {
    public static String test() { return "B"; }
  }
}

Если вы измените код на B b = new B (); он распечатает «B».

(Будет ли когда-нибудь хорошей идеей «переопределить» статические методы - это, вероятно, обсуждение в другой день ...)

5
ответ дан 18 December 2019 в 06:02
поделиться

Потому что это. обычно ссылаются на методы экземпляра, поэтому делать это - плохая идея.

2
ответ дан 18 December 2019 в 06:02
поделиться

Статические методы не привязаны к экземпляру класса , поэтому не имеет смысла вызывать его из this , чем вызывать его из Class.staticMethod () , гораздо более читабельный.

11
ответ дан 18 December 2019 в 06:02
поделиться

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

Если вам нужно инициализировать статические объекты, используйте

private static List l = new ArrayList();   static { l.add("something"); }

Если вам все еще нужно вызвать его, совершенно законно вызывать локальные статические методы без префикса имени локального класса, как это (без предупреждения о затмении)

public MyClass() { staticMethod(); }
3
ответ дан 18 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: