Почему использование приращения префикса считается лучше, чем постфиксное увеличение в стандарте для построения
Недавно я установил Checkstyle для Eclipse и лично думаю, что это потрясающе. Но одно из предупреждений, которое мне дает, немного неясное. Точное предупреждение: "Использовать ++
запрещено". Речь идет о postfix ++
в некоторой строке, например
for(int i = 0; i < SOMETHING; i++)
Хорошо, я знаю, что foreach
является лучшей конструкцией для итерации, но ее нельзя применять везде, иногда старая школа ++
является единственной альтернативой.
Когда я меняю строку на
for(int i = 0; i < SOMETHING; ++i)
предупреждение исчезает. Я знаю разницу между i++
и ++i
, и к этому моменту своей жизни я считал их взаимозаменяемыми в стандартной конструкции for
. Но Checkstyle считает i++
вредным (или подверженным ошибкам).
Вопрос: Почему приращение префикса лучше, чем добавление постфикса в конструкциях for
? Или... это Checkstyle не так?
Ответы
Ответ 1
Пострикс-инкремент имеет смысл только при использовании в выражении, где вам нужно старое значение до модификации. В контекстах void, где это значение отбрасывается (как в вашем цикле for
), сохранение старого значения не имеет смысла.
Другими словами:
// makes sense because you need the old value to subscript the array
stack[top++] = x;
// in a void context, the old value is discarded
top++;
В С++, в частности, оба этих оператора могут быть перегружены, а реализация постфикса может быть неэффективной из-за требования вернуть старое значение - обычно это связано с копированием старого объекта в соответствии с исходной семантикой постфиксный оператор.
С примитивными типами любой достойный компилятор будет генерировать идентичный код для обоих случаев, но второй лучше с семантической точки зрения языка.
Ответ 2
Это глупое правило, ИМХО. Его описание здесь
IllegalToken
Проверяет наличие незаконных токенов.
Rational: некоторые языковые функции часто приводят к сложным кода или неочевидны для начинающих разработчиков. Другие функции могут быть обескуражены в определенных рамках, например, не имеют собственных методов в компонентах EJB.
По умолчанию он запрещает приращения постфикса, постфиксные сокращения и переключатели. Вы можете безопасно отключить правило или настроить его по-другому.
Мое мнение таково, что ваше правило - стандартная идиома Java, и что замена я ++ на ++ я не будет иметь никакого другого эффекта, чтобы заставить новичков спросить себя, почему стандартная идиома не используется.