当我在Java中声明它时,我应该为变量赋值吗?

时间:2010-02-20 18:49:42

标签: java variables types object variable-assignment

我有一个包含以下行序列的代码:

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

我不明白为什么我们想要第一线。我知道Java无法从其值中定义变量的类型。这就是为什么首先我们需要告诉echoSocket是具有Socket类型的变量(第一行),而且我们认为echoSocket具有一定的值(类Socket的对象)。

但是我不明白为什么我们需要分配两次值?为什么我们要说echoSocket等于null?

5 个答案:

答案 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)

技术作家并不总是写出最好的代码。

我个人只在编译器告诉我时才写入初始值。