Использование частного конструктора для предотвращения инстанцирования класса?

Прямо сейчас я думаю о добавлении частного конструктора к классу, который только содержит некоторых String константы.

public class MyStrings {
  // I want to add this:
  private MyString() {}

  public static final String ONE = "something";
  public static final String TWO = "another";
  ...
}

Есть ли какая-либо производительность или память наверху, если я добавляю частного конструктора к этому классу для предотвращения кого-то для инстанцирования ее?

Вы думаете, что это необходимо вообще или что частные конструкторы с этой целью являются пустой тратой времени и кодируют помеху?

ОБНОВЛЕНИЕ

Я иду для заключительного класса с частным конструктором и описательным javadoc для класса. Я не могу использовать ПЕРЕЧИСЛЕНИЕ (который я предпочел бы), потому что я застреваю на Java 1.4 на данный момент. Это было бы моей модификацией:

/**
 * Only for static access, do not instantiate this class.
 */
public final class MyStrings {
  private MyString() {}

  public static final String ONE = "something";
  public static final String TWO = "another";
  ...
}
15
задан cringe 3 May 2010 в 06:09
поделиться

8 ответов

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

Есть несколько способов можно подумать о том, что пользователи предотвращают создание экземпляров с целью создания констант

  1. . Как вы упомянули, класс с частными конструкторами и всеми строковыми константами является одним из способов, даже если есть накладные расходы, которыми можно пренебречь
  2. В противном случае вы можете создать класс с модификатором Final и определить свои строковые константы
  3. Вы можете использовать абстрактный класс со строковыми константами
  4. Вы можете определить строковые константы в файлах свойств и получить доступ из них, это будет определенно уменьшите память и увеличьте гибкость вашего кода.
9
ответ дан 1 December 2019 в 02:19
поделиться

Это правильный способ хранения некоторых констант, как также предлагается в Эффективной Java (2-е изд.), Пункт 19.

0
ответ дан 1 December 2019 в 02:19
поделиться

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

1
ответ дан 1 December 2019 в 02:19
поделиться

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

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

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

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

Синтетический публичный конструктор был бы сгенерирован любым способом.

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

Я также предлагаю сделать класс final и просто для полноты конструктора создать исключение.

Если вам нужен краткий исходный код, вы можете создать enum без значений. Может вызвать некоторую путаницу с начинающими программистами.

0
ответ дан 1 December 2019 в 02:19
поделиться

Можно добавить приватный конструктор, но есть еще два варианта.

В той же ситуации я бы использовал перечислитель. Если это имеет смысл для вашей реализации, вы можете использовать его вместо этого, если это public или private, зависит от того, где вам нужно его использовать:

public enum MyStrings {

  ONE ("something"),

  TWO ("something else");

  private String value;

  private MyStrings(String str) {
     this.value = str;
  }

}

Другим вариантом было бы поместить его в abstract класс, которые не могут быть инстанцированы:

public abstract MyStrings {

  public static final String STUFF = "stuff";
  public static final String OTHER = "other stuff";
}

Доступ и для перечислителя, и для абстрактного класса работает так же, как и в представленной вами реализации:

MyStrings.STUFF
7
ответ дан 1 December 2019 в 02:19
поделиться

Если вы никому не запрещаете создавать объект класса, вы можете сделать его абстрактным, как это

public abstract class MyStrings {
  public static final String ONE = "something";
  public static final String TWO = "another";
}

, и получить доступ к своим статическим переменным, например this

String val1 = MyStrings.ONE;
String val2 = MyStrings.TWO;

Думаю, это было бы более удачным решением.

5
ответ дан 1 December 2019 в 02:19
поделиться
Другие вопросы по тегам:

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