Прямо сейчас я думаю о добавлении частного конструктора к классу, который только содержит некоторых 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";
...
}
Использование частного конструктора для предотвращения создания экземпляра класса?
Есть несколько способов можно подумать о том, что пользователи предотвращают создание экземпляров с целью создания констант
Это правильный способ хранения некоторых констант, как также предлагается в Эффективной Java (2-е изд.), Пункт 19.
Если ваш класс имеет только статические члены, то нет необходимости иметь частный или открытый конструктор. Все члены доступны даже без объекта. На самом деле я считаю, что в таком случае наличие конструктора сбивает с толку.
Я бы предпочел использовать перечисление для хранения этих строк. Это гарантирует, что где бы вы ни использовали эти строки, вам будет передана только одна из разрешенных строк.
Если в этом случае вы добавите частный конструктор, это не приведет к потере производительности или памяти. Кроме того, в этом нет необходимости, поскольку ваши общедоступные статические переменные используются всеми экземплярами вашего объекта.
Синтетический публичный конструктор был бы сгенерирован любым способом.
На самом деле несколько байт из сотен миллионов во время выполнения не будут иметь большого значения.
Я также предлагаю сделать класс final
и просто для полноты конструктора создать исключение.
Если вам нужен краткий исходный код, вы можете создать enum без значений. Может вызвать некоторую путаницу с начинающими программистами.
Можно добавить приватный конструктор, но есть еще два варианта.
В той же ситуации я бы использовал перечислитель. Если это имеет смысл для вашей реализации, вы можете использовать его вместо этого, если это 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
Если вы никому не запрещаете создавать объект класса, вы можете сделать его абстрактным, как это
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;
Думаю, это было бы более удачным решением.