【问题标题】:Should I assign a value to a variable when I declare it in Java?在Java中声明变量时是否应该为变量赋值?
【发布时间】:2010-02-20 18:49:42
【问题描述】:

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

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

我不明白为什么我们想要第一行。好吧,我知道 Java 无法根据变量的值定义变量的类型。这就是为什么首先我们需要告诉 echoSocket 是具有 Socket 类型的变量(第一行),然后我们认为 echoSocket 具有特定的值(Socket 类的对象)。

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

【问题讨论】:

  • 你不需要做两次,你需要在将它用于除作业之外的任何事情之前做。

标签: java variables types object variable-assignment


【解决方案1】:

我使用的一般原则是:尽可能晚地声明一个变量。

但是,有一个非常有用的情况是不初始化变量:

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】:

如果不使用局部变量,则无需为它赋值。代码通常不应该在必要时声明变量。 JLS 中关于明确分配的章节有些枯燥。

您的问题似乎与尝试块有关。资源处理应该写成:

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

在这种情况下:

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

异常的捕获应该在很多地方进行。不要尝试保存尝试块。

如果您发现自己重复了很多样板,请尝试 Execute Around Idiom。

【讨论】:

    【解决方案3】:

    为什么要在变量获得有用值之前声明变量?如果要在两个不同的分支中分配,有时这是必要的,但通常最好等到你有一个值,然后在一个语句中声明和分配:

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

    【讨论】:

    • 我有个主意(不确定好不好)。也许任务并不总是成功的?我们尝试在“try”块中使用“new Socket”(为 echoSocket 设置一个值),然后我们假设 echoSocket 有一个值。但是不能保证“新套接字”有效。所以最好在try块中赋值之前给echoSocket赋值。只是为了确定一个价值。
    • @Roman:如果套接字构造函数失败,你还能继续你的方法吗? sort 的情况是改为分配 null 的原因之一,但通常我发现我希望无论如何都立即重新抛出异常。
    【解决方案4】:

    你不需要给echoSocket 赋值为null。 (你从哪里读到的?)

    你可以选择任何一个

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

    或一行完成

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

    希望对你有帮助..

    【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-11-08
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-07
      相关资源
      最近更新 更多