2010-02-20 2 views
2

У меня есть код со следующей последовательностью строк:Должен ли я присваивать значение переменной, когда я объявляю ее в Java?

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

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

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

+2

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

ответ

2

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

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

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

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

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

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

Если вы обнаружите, что повторяете много шаблонов, попробуйте Execute Around Idiom.

1

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

Socket echoSocket = new Socket("taranis", 7); 
+0

У меня есть идея (не уверен, что это хорошо). Может быть, назначение не всегда успешное? Мы пытаемся использовать «новый Socket» в блоке «try» (чтобы установить значение для echoSocket), и мы предполагаем, что echoSocket имеет значение. Но нет гарантии, что «новый Socket» работал. Поэтому лучше назначить значение echoSocket перед назначением в блоке try. Просто чтобы иметь значение точно. – Roman

+0

@Roman: Если конструктор сокета не удался, вы все равно сможете продолжить свой метод? То, что * sort * ситуации является одной из причин вместо этого назначать нуль, но обычно я нахожу, что я хочу, чтобы исключение было немедленно возвращено в любом случае. –

1

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

Вы можете пойти либо

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

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

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

Надеется, что это помогает ..

+0

Я получил код отсюда: http://java.sun.com/docs/books/tutorial/networking/sockets/readingWriting.html – Roman

5

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

Существует один очень полезный случай для не инициализирует переменную однако:

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 
} 
0

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

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

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