2010-12-07 4 views
5

Я только что прочитал коды кода Java ; очень хороший документ кстати. И я прочитал этуjava beginner: инициализация переменных класса

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))); 
     } 
    } 
} 

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

Возникает вопрос:

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

ответ

4

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

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

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

+0

Да, я согласен с вами после того, как у меня появилось больше опыта – 2011-10-06 10:57:28

1

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

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

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

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

0

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

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

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

1

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

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

Смежные вопросы