Лучшие практики для инициализации атрибутов объекта в ОО Языки - PullRequest
7 голосов
/ 07 декабря 2011

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

Например:

class myClass{

   private String name = "";// initialize here

   public myClass(){

    //something

   }
}

Но в некоторых учебниках они не удосуживаются сразу инициализироваться.Что лучше?Имеет ли это значение?

Ответы [ 3 ]

6 голосов
/ 07 декабря 2011

Один случай, когда лучше не инициализировать inline, это когда у вас есть несколько конструкторов, которые инициализируют поля по-разному. Было бы неэффективно инициализировать ваше поле в объявлении, а затем заменить это значение значением, переданным конкретному конструктору позже.

3 голосов
/ 07 декабря 2011

Это неоднократно возникало в SO, поэтому вам следует искать на сайте дополнительные мнения.

Мое предложение для Java (это имеет смысл только в определенных языках):

Если начальныйзначение фиксируется для класса, затем инициализируется inline.

Если разные конструкторы устанавливают разные начальные значения, присвойте значения в соответствующем конструкторе.

В C ++ 11 ситуация несколько похожа.

0 голосов
/ 07 декабря 2011

Это полностью зависит от того, как класс предназначен для использования.

Один из примеров - классы значений, которые вы часто можете использовать как неизменяемые. В идеале в этом случае вы должны установить значения в конструкторе.

public final class Foo {
    private final String foo;
    public Foo(String foo) {
        this.foo = foo;
    }
}

Если есть действительно разумные значения по умолчанию, вы можете указать их в пункте объявления. Как правило, довольно легко увидеть ожидаемое значение по умолчанию. Конечно, это не работает с окончательными полями (как указано выше), так как невозможно назначить другое значение.

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

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

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