#java #constants
#java #константы
Вопрос:
Ниже приведен фрагмент кода ArrayList, который либо принимает ‘initialCapacity’, предоставленный пользователем, либо по умолчанию 10
. Мой вопрос — почему 10 не было статической константой? Я предполагаю, что константы используются, когда переменная повторяется в коде более одного раза. Я прав?
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "
initialCapacity);
this.elementData = new Object[initialCapacity];
}
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this(10);
}
Комментарии:
1. В подобных случаях это в значительной степени вопрос стиля. Это можно было бы сделать как статическую константу, но автор, вероятно, посчитал, что это не улучшит читабельность.
Ответ №1:
Константы используются для присвоения имен переменным.
Вы могли бы назвать это « DEFAULT_INITIAL_CAPACITY
»
хорошая программа — это та, которую вы можете читать как историю.
Вот фрагмент кода, например:
char * find_type(char *str,int *type){
str = trim_leading_space(str);
if(*str == SLASH_SIGN){
str ;
}else{
display_error(BAD_TYPE_FORMAT, str);
}
str = trim_leading_space(str);
*type = convert_to_zero_or_one(str[0]);
if(*type == NO){
display_error(BAD_TYPE_FORMAT, str);
}else {
str ;
}
return str;
}
код написан на C, но все же доказывает мою точку зрения.
вот определение « BAD_TYPE_FORMAT
»
#define BAD_TYPE_FORMAT 34
если бы я оставил это как 34
, когда кто-то пришел редактировать мой код, он бы не знал, почему я написал в нем именно 34.
Но это был просто следующий индекс ошибки из длинного списка возможных ошибок.
Ответ №2:
Константы предназначены для того, чтобы сделать ваш код более читаемым. Для Java просто не имеет значения, объявляете ли вы какую-либо вещь как постоянную или нет. Как только код будет скомпилирован, каждая константа будет объединена (не уверен, можно ли использовать этот термин здесь), и если это выражение, которое можно вычислить во время компиляции, оно будет.
Итак, если вы напишете
int INITIAL_CAPACITY = 10;
public ArrayList() {
this(INITIAL_CAPACITY);
}
после компиляции всегда будет преобразовано в
public ArrayList() {
this(10);
}
Все это делается для экономии времени во время выполнения. Поэтому лучше объявлять константы отдельно, поскольку это делает их более удобочитаемыми, поскольку в них четко указано, для чего они предназначены. В вашем случае значение INITIAL_CAPACITY имеет больше смысла для тех, кто не знаком с кодом, чем просто ’10’, используемое в вызове.
Вам не нужно беспокоиться об этой оптимизации, поскольку JVM сделает это за вас. Вы должны попытаться сделать ее более читаемой.
Ответ №3:
Для этого существует константа, начиная с Java 7.
В примере кода, который вы публикуете, значение используется только один раз, и комментарий описывает, для чего оно предназначено, поэтому нет смысла использовать константу. Можно утверждать, что лучше без константы, потому что при чтении вам не нужно останавливаться и искать определение константы. Использование константы создает у читателя ожидание, что это то, что будет отображаться несколько раз, жесткое кодирование этого дает понять, что это значение больше нигде не появляется. По этим причинам отказ от использования константы мог быть сделан для улучшения удобства чтения.
Как только логика инициализации изменилась на ленивую, на значение емкости по умолчанию пришлось ссылаться в двух местах (потому что его нужно было проверять при добавлении нового элемента). Введение константы имело смысл; если сопровождающий класса хочет изменить начальную емкость, тогда ему нужно внести изменения только в одном месте.
Ответ №4:
Вы правы, вы должны использовать константы, когда переменная повторяется более одного раза. Вы должны использовать Sonar для проверки такого рода рекомендаций.