Полагаться на инициализацию поля по умолчанию - это плохой стиль программирования? [закрыто]

20

Мне дали ссылку на официальную документацию оракула: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

где сказано:

Значения по умолчанию

Не всегда необходимо присваивать значение при объявлении поля. Поля, которые объявлены, но не инициализированы, будут установлены разумным значением по умолчанию компилятором. Вообще говоря, это значение по умолчанию будет нулевым или нулевым, в зависимости от типа данных. Однако полагаться на такие значения по умолчанию считается плохим стилем программирования.

Я хочу подчеркнуть эту часть:

Однако полагаться на такие значения по умолчанию считается плохим стилем программирования.

Но, о боже, это, я бы сказал, фундаментальная часть спецификации языка, зная, что переменные экземпляра имеют значения по умолчанию. С какой стати это плохая практика программирования, если она широко используется даже в исходном коде библиотек Java SE?

Andremoniy
источник
5
Да. Я никогда не знал, что это заявление было там. Я действительно считаю хорошей практикой полагаться на них. private int count = 0;это код, который ничего не делает, и код, который ничего не делает, беспорядок. Это похоже на импорт классов из java.lang или объявление класса с помощью extends Object.
VGR
2
... или иметь public abstractметод в интерфейсе.
mumpitz
1
что не так с публичным рефератом?
Джон Китс
1
Часть головоломки может быть из C ++. Это популярный язык, и его обработка инициализации по умолчанию вместо нулевой инициализации является постоянным источником ошибок. В C ++ очень плохая идея полагаться на значения по умолчанию во всех случаях, кроме самых исключительных. Это могло просочиться в Яву культурно.
Cort Ammon
@JohnKeates - Моя Java немного ржавая, но privateметоды в интерфейсе не имеют смысла, и abstractэто подразумевается.
Скотт Смит

Ответы:

6

Цитируемый текст:

«Однако полагаться на такие значения по умолчанию считается плохим стилем программирования».

Цинично: «обычно считается, что» часто является способом сказать, что автор не пытался найти авторитетный источник для представляемого утверждения.

В этом случае утверждение явно сомнительно. Свидетельство: 5 из 5 выбранных руководств по стилю Java НЕ говорят о том, следует ли вам полагаться на значения по умолчанию:

(Обратите внимание, что моя методология выборки состояла в том, чтобы посмотреть на первые 5 различных поисковых запросов Google на предмет «руководства по стилю java». Затем я искал в каждом документе «default». Это не тщательный анализ, но он служит моей точкой зрения. )


ХОРОШО. Так действительно ли это помогает читабельности кода Java?

Это спорно.

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

С другой стороны, мы обычно не ожидаем, что начинающие Java-программисты будут поддерживать производственные базы кода. Для опытного Java-программиста избыточная инициализация не улучшает читабельность. Это (в лучшем случае) шум.

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

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


Как насчет надежности?

В Java это не имеет значения. JLS указывает , что инициализация по умолчанию это происходит для полей. И наоборот, для локальных переменных это ошибка компиляции, чтобы попытаться использовать переменную, которая не была определенно инициализирована.

Короче говоря, поведение переменной, которая не инициализирована явно, полностью предсказуемо.

В отличие от таких языков, как C или C ++, где переменные не могут быть инициализированы, поведение не определено и может привести к сбоям и различиям в поведении на разных платформах. Случай всегда явной инициализации переменных здесь гораздо сильнее.


Как насчет производительности?

Это не должно иметь никакого значения. JIT-компилятор должен обрабатывать избыточную инициализацию и инициализацию по умолчанию как одно и то же.

Стивен С
источник
19

Просто: полагаться на значения по умолчанию не означает намерение.

Вы действительно хотели, чтобы это поле начиналось с 0, или вы забыли присвоить значение ?!

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

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

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

GhostCat приветствует Монику С.
источник
3
то есть re: не сообщая намерение - Что, если "Мэнни сопровождающий" смотрит на ваш код и не знает, каково значение по умолчанию для определенного типа данных. Он предполагает, что он равен 0, когда он действительно равен NULL, и это полная ошибка при проверке === (или любой другой эквивалент эквивалентной проверки для значения и типа в java, равно ()?). Часы поиска (для неопытного программиста) могут быть результатом чего-то такого простого. PS пытаюсь сыграть адвоката дьявола. Я говорю: используйте настройки по умолчанию весь день (хотя я никогда этого не делаю) и заставьте умных людей (или, по крайней мере, уделять больше внимания деталям) поддерживать свой код.
TCooper
@TCooper, когда Мэнни, сопровождающий, очень мало знает о Java, он не имеет никакого отношения к реальному Java-коду. Но я согласен с основным понятием. Это осложняет жизнь новичкам.
GhostCat приветствует Монику С.
12

С какой стати это плохая практика программирования

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

... если он широко используется даже в исходных кодах библиотек Java SE ??

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

Майкл Берри
источник
2
Это, вероятно, правильно, хотя я не согласен с этим.
VGR
3
@VGR Поскольку я склонен согласиться с утверждением о том, что полагаться на значения по умолчанию является неоптимальным, я осторожно сформулировал его нейтрально по этой причине. Качество кода субъективно, и я хорошо знаю, что это отнюдь не универсальная точка зрения.
Майкл Берри