В чем разница между частной статической переменной и частной переменной экземпляра в одноэлементном классе? - PullRequest
0 голосов
/ 12 января 2012

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

Я не вижу смысловой разницы.

РЕДАКТИРОВАТЬ : Не спрашивать, должна ли переменная, содержащая сам экземпляр, быть статической, но другие члены данных.

Ответы [ 5 ]

1 голос
/ 12 января 2012

Я не уверен, что вы ищете, поэтому я напишу что-нибудь и посмотрю, что вы скажете.

public class Elvis {
  private static final Elvis INSTANCE = new Elvis();
  private double weight; // in pounds

  private Elvis() { weight = 300.; } // inaccessible

  public static Elvis getInstance() { return INSTANCE; }

  public double getWeight() { return weight; }
  public void setWeight(double weight) { this.weight = weight; }
}

Поскольку есть только один Элвис, вы могли бы сделать weight статическая переменная (со статическим геттером и сеттером).Если вы сделаете все переменные статическими, то нет смысла определять одиночный INSTANCE, поскольку у вас просто есть класс, содержащий только статические переменные и методы:

public class Elvis {
  private static double weight; // in pounds
  static { weight = 300.; } // Could just have set the weight directly above,
                // but a static block might be useful for more complex examples. 

  public static double getWeight() { return weight; }
  public static void setWeight(double weight) { this.weight = weight; }
}

Полагаю, этого следует избегать, так как он больше похож нафайл заголовка на C, чем OO.

Некоторые, возможно, распознали ссылку Элвиса из J. Bloch "Effective Java".Рекомендация в этой книге состоит в том, чтобы реализовать шаблон синглтона с перечислением с одним членом:

public enum Elvis {
  INSTANCE;

  private double weight = 300.;

  public double getWeight() { return weight; }  
  public void setWeight(double weight) { this.weight = weigth; }
}

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

1 голос
/ 12 января 2012

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

Лично для меня это было бы немного "кодовым запахом". Я имею в виду, что кто-то сделал синглтон и все еще объявил его член статическим? Что это говорит мне? Есть что-то, чего я не знаю? Или может быть что-то не так с реализацией, и она должна быть статичной (но почему ?!). Но я немного параноик. Из того, что я также знаю, нет никаких причин производительности, почему это было бы хорошим вариантом.

1 голос
/ 12 января 2012

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

0 голосов
/ 12 января 2012

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

0 голосов
/ 12 января 2012

Хотя есть и различия. Например, вы не можете использовать статический блок для инициализации первого.

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