Java начинающий: инициализация переменных класса - PullRequest
5 голосов
/ 07 декабря 2010

Я только что прочитал соглашения Java-кода SUN ;очень хороший документ, кстати.И я прочитал это

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

И мне было интересно, если Class variables имеет такое же предложение или нет, например, яиметь:

public class NNmatrix {

    protected ArrayList<ArrayList<Double>> matrix;     // line 1
    public NNmatrix() {
        matrix = new ArrayList<ArrayList<Double>>();     // line 2
    }
    /**
     * 
     * @param otherMtrx
     */
    public NNmatrix(final ArrayList<ArrayList<Double>> otherMtrx) {
        final int rows = otherMtrx.size();
        matrix = new ArrayList<ArrayList<Double>>(rows);  // line3
        for (int i = 0; i < rows; i++) {
            this.matrix.add(new ArrayList<Double>(otherMtrx.get(i)));
        }
    }
}

КОД РЕДАКТИРОВАНИЯ # Если бы я инициализировал variable там, где он объявлен (в классе), я бы удалил"строку 2" и оставил «строка 3», потому что проблема производительности # резервирования (строк) в памяти, как вы знаете.

Вопрос в следующем:

  1. Делает ли это, что хорошая практика или вопрос инициализации применяются только к локальным переменным внутри методов и т. Д. Только?
  2. Если все в порядке, я хочучтобы знать, что будет первым, если я выполнил КОД РЕДАКТИРОВАНИЯ # инициализация @ строка 3 или инициализация @ строка 1?

Ответы [ 4 ]

4 голосов
/ 07 декабря 2010

Это экземпляр переменные, а не переменные класса.Переменные экземпляра принадлежат конкретному объекту, переменные класса - нет (извините, если не придираться).

Я думаю, что инициализация переменной, в которой она объявлена, проще и проще для чтения.

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

1 голос
/ 08 декабря 2010

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

Хотя в целом мне нравится инициализировать переменные экземпляра при объявлении, я не люблю делать это, когда мне нужно повторно инициализировать ихкакой-то конструктор.Я предпочитаю либо инициализировать в объявлении, либо в каждом пути конструктора (возможно, просто в одном конструкторе, вызываемом любым другим конструктором).Чистое объявление сигнализирует о том, что происходит что-то более сложное, в то время как перемещение самой простой инициализации в объявление может скрыть это.

1 голос
/ 07 декабря 2010

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

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

Во втором предоставленном вами конструкторе вы можете подготовить хороший пример инициализации в конструкторе.

С переменными класса я нашел несколько раз, гдеЯ хотел бы инициализировать в блоке создания экземпляров вместо встроенного в объявлении.

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

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

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

  2. Насколько я понимаю, инициализация будет происходить примерно в одно и то же время, если происходит в конструкторе против объявления.Мне никогда не приходилось знать, что на самом деле является первым на практике, но вы могли бы сделать простой тест System.out, чтобы узнать.

...