我有一个包含以下行序列的代码:
Socket echoSocket = null;
... something ...
echoSocket = new Socket("taranis", 7);
我不明白为什么我们想要第一线。我知道Java无法从其值中定义变量的类型。这就是为什么首先我们需要告诉echoSocket是具有Socket类型的变量(第一行),而且我们认为echoSocket具有一定的值(类Socket的对象)。
但是我不明白为什么我们需要分配两次值?为什么我们要说echoSocket等于null?
答案 0 :(得分: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
}
答案 1 :(得分:2)
如果未使用它,则无需为局部变量赋值。代码应该在必要时通常不会声明变量。关于明确分配的JLS中有一个有点枯燥的章节。
你的问题似乎与try-blocks有关。资源处理应写为:
acquire();
try {
use();
} finally {
release();
}
在这种情况下:
final Socket echoSocket = new Socket("taranis", 7);
try {
... something ...
} finally {
echoSocket.close();
}
应该抓住异常。不要试图保存试用块。
如果你发现自己重复了很多样板,那就试试Execute Around Idiom。
答案 2 :(得分:1)
为什么要提前声明变量而不是它有用的值呢?如果它将在两个不同的分支中分配,有时候这是必要的,但通常最好等到你有一个值,并在一个语句中声明和赋值:
Socket echoSocket = new Socket("taranis", 7);
答案 3 :(得分:1)
您无需为echoSocket
提供null值。 (你在哪里读到的?)
你可以选择
Socket echoSocket;
... something ...
echoSocket = new Socket("taranis", 7);
或在一行中完成
... something ...
Socket echoSocket = new Socket("taranis", 7);
希望有所帮助......
答案 4 :(得分:0)
技术作家并不总是写出最好的代码。
我个人只在编译器告诉我时才写入初始值。