Какой «правильный» способ сделать это (если утверждение) - PullRequest
6 голосов
/ 03 июня 2010

У меня их полно, и мне интересно, не возникнут ли у меня проблемы - или проблемы с производительностью.

У меня есть метод A:

<code>
MyClass monkey;
...
if(monkey != null) {
 ...
}

Или метод B:

<code>
boolean hasMonkey; //This is set to TRUE when monkey is not null
MyClass monkey;
...
if(hasMonkey) {
 ...
}

На функциональном уровне они оба делают одно и то же. Прямо сейчас я использую метод А. Это плохой способ делать вещи? Что будет лучше?

Ответы [ 8 ]

19 голосов
/ 03 июня 2010

Метод А - это то, что я видел как «общий» случай. Метод B представляет проблему согласованности данных (что означает, что hasMonkey не устанавливается правильно?), В то время как метод A полагается только на сам объект, чтобы определить его достоверность. На мой взгляд, метод А намного лучше.

3 голосов
/ 03 июня 2010

Нет ничего плохого в методе А, ИМО. Метод B является своего рода нарушением принципа СУХОЙ (как я его вижу) - установка и проверка флага, указывающего, является ли ссылка monkey нулевой, является дублированием / избыточностью.

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

3 голосов
/ 03 июня 2010

Метод A просто имеет больше смысла, поскольку он хранит данные в одном месте, поэтому вам не нужно беспокоиться об обновлении hasMonkey везде.

3 голосов
/ 03 июня 2010

Метод А в порядке - зачем загромождать код ненужными переменными?

2 голосов
/ 03 июня 2010

Определенно метод А. Если вы хотите проверить monkey против null, просто сделайте это. Зачем вам задействовать дополнительную переменную? Кто следит за тем, чтобы всегда правильно его настраивать? Больше головной боли, больше подвержено ошибкам, нет выгоды.

2 голосов
/ 03 июня 2010

Я бы сказал, используйте первый метод.

Проблема второго метода в том, что у вас избыточная информация. Вполне возможно, что вы можете получить ситуацию, когда у вас есть monkey, но hasMonkey неверно или, возможно, хуже: согласно hasMonkey у вас есть обезьяна, но когда вы пытаетесь получить доступ к члену, она выдает NullPointerException. Первый метод позволяет избежать этой потенциальной проблемы.

1 голос
/ 03 июня 2010

В общем, я бы выбрал A - более четкий, простой и последовательный.

Но, если это в узком цикле, то вы можете попробовать второй, но всегда профиль. Будет ли увеличение производительности, зависит от того, насколько умна виртуальная машина. В зависимости от реализации виртуальной машине может потребоваться проверить нулевой указатель, прежде чем использовать ссылку «monkey», если базовое оборудование не может быть использовано для захвата неверного доступа указателя. В этом случае виртуальная машина всегда проверяет ссылку, но она также может быть достаточно умной, чтобы выяснить, не является ли ссылка нулевой - например, если у вас есть явная проверка. Таким образом, использование A все еще может быть наиболее эффективным вариантом.

0 голосов
/ 03 июня 2010

Метод A, безусловно, лучше, так как вам не нужно тратить дополнительные служебные данные на другое логическое значение, которое потребует дополнительного пространства памяти в стеке, и, согласно вашему описанию, должно поддерживаться в объеме до объекта Monkey.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...