Почему предпочтительно вызывать статический метод статически из экземпляра класса метода? - PullRequest
5 голосов
/ 23 апреля 2010

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

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

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

против

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

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

EDIT:

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

Ответы [ 5 ]

11 голосов
/ 23 апреля 2010

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

6 голосов
/ 23 апреля 2010

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

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

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

Если вы думаете, что люди, читающие ваш код, незнакомы с ним, вы, как правило, пытаетесь сделать код более понятным, и в этом случае код становится более понятным, если вместо Class.amehod использовать instanceNmethod.

5 голосов
/ 23 апреля 2010

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

В приведенном ниже коде не совсем очевидно, что 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».

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

3 голосов
/ 23 апреля 2010

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

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

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

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

public MyClass() { staticMethod(); }
2 голосов
/ 23 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...