Java方法中的字符串常量与变量

3
不可改变的、恒定的值应该存储在常量中而不是变量中,这样可以使代码更加安全和清晰。
然而,对于所有不可改变的值,后者并不适用:有一种方法只被调用一次,在初始化使用相同值的应用程序时,该字符串仅在该方法内被引用和使用。
我的问题是:变量/常量定义的最佳方式是什么?作为大型应用程序中的简单字符串,性能和内存可以忽略不计,更多考虑可读性和维护性。
它是方法内的变量吗?
protected void init() {
    final String thestring = "thevalue";

    methodA(thestring);
    methodB(thestring);
}

或者它是在类级别上保持不变的(尽管仅在方法中使用):
private static final String THESTRING = "thevalue";

protected void init() {

    methodA(THESTRING);
    methodB(THESTRING);
}

或者有第三个更好的解决方案吗?请考虑在同一类中可能存在更多类似的方法。

为了可维护性,最好将theValue保存在配置/属性文件中。 - Shailesh Aswal
为什么不使用这个字符串定义一个新的ENUM并使用它呢? - TheLostMind
“哪个更好?”这种情况很大程度上取决于个人喜好。在许多情况下,您应该直接在代码中使用字面字符串,而不定义一个“变量”来保存它。在其他情况下,由于翻译问题,您所做的事情是相当明确的。如果变量需要轻松修改(例如,它是一个URL或类似的东西),那么将其放在顶部可以更容易地找到它,即使只在一个地方使用。 - Hot Licks
3个回答

3
对我来说,最好的解决方案是在方法内部使用变量-因为它是内部变量。所以其他方法不应该看到它。考虑封装和清晰的代码,当你试图将这个变量移动到类级别时,你会得到一个很长的类变量列表。
另一件事是内存。方法执行后,变量会被销毁。当您将其定义为静态时,它将一直存在于您的内存中。

2
通常常量在类的多个实例之间共享,因此它们应该在类级别上定义。每个MATH实例都有一个单独的 PI 对象是没有意义的。 - TheLostMind
但是PI是公共变量,被许多其他人使用。在上面的例子中,这些变量只会在一个方法中使用。 - KirkoR
我猜@kajax的答案解决了你的疑问...在类级别上保留该值可增加可扩展性和可读性。 - TheLostMind
在我看来,在这种情况下,“可扩展性和可读性”不是一个争论点。它仍然是在一个方法内部使用的最终变量。在这种情况下,可读性是相同的,可扩展性是过度编程。 - KirkoR

1

我可以想到三个地方可以放置你的变量(当然,都是 final 的),每个地方都有其优缺点。

  1. 局部变量。
  2. 私有静态字段,在你的类内部。
  3. 公共静态字段,在一些 Properties 类内部。

1 - 优点:变量只能在你的方法内部看到 - 高代码安全性。缺点:变量被封装在方法内部,可能很难找到和更改。

(我将跳过第二个,因为它只是第一个和第三个之间的折衷方案)

3 - 优点:你的字段位于其他可配置字段中,这使得更改设置变得容易。缺点:字段是公共的,每个人都可以看到它(但是 Stringimmutable,所以没有人能够更改它)。

总结:取决于你期望需要多少更改你的变量(例如平衡、颜色变化等)。如果你确信这个字符串值是正确的,我不会担心将其放入局部变量中。


0

通常常量不是实例特定的。因此,将常量存储为静态变量而不是成员变量是更好的做法。其优点包括:

  • 只有一个变量分配,而不是每个对象都分配一个。
  • 您无需创建实例变量即可访问常量,例如,在Java Math类中,PI被声明为静态变量。

在这种情况下并不适用,因为根据问题描述,该方法只被调用一次。因此,在两种情况下都只有一个分配。另外,当声明为静态时,内存不会被释放。 - msp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接