Должен ли я присвоить значение переменной, когда я объявляю его в Java? - PullRequest
2 голосов
/ 20 февраля 2010

У меня есть код со следующей последовательностью строк:

Socket echoSocket = null;
... something ...
echoSocket = new Socket("taranis", 7);

Я не понимаю, почему мы хотим иметь первую строку. Я знаю, что Java не может определить тип переменной по ее значению. Поэтому сначала нам нужно сказать, что echoSocket - это переменная с типом Socket (первая строка), а затем мы получаем, что echoSocket имеет определенное значение (объект класса Socket).

Но я не понимаю, почему нам нужно присвоить значение два раза? Почему мы хотим сказать, что echoSocket равен нулю?

Ответы [ 5 ]

5 голосов
/ 20 февраля 2010

Общий принцип, который я использую, таков: объявляйте переменную как можно позже.

Однако есть один очень полезный случай, чтобы не инициализировать переменную:

String someString;
if (/* some condition */) {
  someString = "foo";
} else {
  someString = "bar";
}

Поскольку someString унифицируется при объявлении, если, скажем, в предложении else не установлено значение, компилятор Java будет жаловаться на унифицированные значения. Это было бы не так, если бы вы сделали это:

String someString = null;
if (/* some condition */) {
  someString = "foo";
} else {
  // do nothing
}

Это хорошая проверка здравомыслия. Выше не ошибка компиляции, но это:

String someString;
if (/* some condition */) {
  someString = "foo";
} else {
  // do nothing
}
2 голосов
/ 20 февраля 2010

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

Похоже, у вас проблема с try-блоками.Обработка ресурсов должна быть записана в виде:

acquire();
try {
    use();
} finally {
    release();
}

В этом случае:

final Socket echoSocket = new Socket("taranis", 7);
try {
    ... something ...
} finally {
    echoSocket.close();
}

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

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

1 голос
/ 20 февраля 2010

Вам не нужно указывать echoSocket значение null. (Где ты это прочитал?)

Вы можете пойти с

Socket echoSocket;
... something ...
echoSocket = new Socket("taranis", 7);

или сделать это в одну строку

... something ...
Socket echoSocket = new Socket("taranis", 7);

Надеюсь, это поможет ..

1 голос
/ 20 февраля 2010

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

Socket echoSocket = new Socket("taranis", 7);
0 голосов
/ 22 февраля 2010

Технические писатели не всегда пишут лучший код.

Лично я пишу начальные значения только тогда, когда компилятор говорит мне.

...