【问题标题】:String constant vs variable in a Java methodJava方法中的字符串常量与变量
【发布时间】:2014-07-03 11:03:09
【问题描述】:

不可更改的常量值应为stored in constants rather than variables,以使代码更安全、更简洁。

但后者并不适用于所有不可更改值的情况:以下方法仅调用一次,在初始化应用程序时使用相同的字符串值两次。 String 仅在方法内部被引用和使用。

我的问题是:变量/常量定义的最佳方式是什么?作为大型应用中的简单String,性能和内存可以忽略不计,更多的是可读性和可维护性。

是否作为方法内部的变量:

protected void init() {
    final String thestring = "thevalue";

    methodA(thestring);
    methodB(thestring);
}

还是在类级别作为常量(虽然只在方法中使用):

private static final String THESTRING = "thevalue";

protected void init() {

    methodA(THESTRING);
    methodB(THESTRING);
}

还是第三种更好的解决方案?另请注意,同一类中可能有更多类似的方法。

【问题讨论】:

  • 为了可维护性,人们宁愿将值保存在配置/属性文件中。
  • 为什么不用这个字符串定义一个新的ENUM 并使用它?
  • “哪个是最好的?”,在这种情况下,在旁观者的眼中非常重要。在许多情况下,您应该只在代码中使用文字字符串内联,而不是定义“变量”来保存它。在其他情况下,您所做的事情由翻译问题很好地定义。如果变量需要轻松修改(例如,它是一个 URL 或类似的),那么将它放在顶部会更容易找到,即使只在一个地方使用。

标签: java variables constants code-readability


【解决方案1】:

对我来说,最好的解决方案是在方法中使用变量——因为它是内部变量。所以其他方法不应该看到它。考虑封装和干净的代码,当你尝试在类级别移动这个变量时,你会得到一个很长的类变量列表。

另一件事是记忆。方法执行后,变量被销毁。当您将其定义为静态时,它将一直存在于您的记忆中。

【讨论】:

  • 通常常量在一个类的多个实例之间共享,因此它们应该在类级别。为每个 MATH 实例设置一个单独的 PI 对象是没有意义的。跨度>
  • 但是 PI 是公共变量,被许多其他人使用。在上面的示例中,这些变量将仅用于一种方法。
  • 我猜@kajax 的回答消除了你的疑虑......在类级别保持该值可提高可扩展性和可读性。
  • 在我看来,在这种情况下,“可扩展性和可读性”不是和论点。它仍然是内部用于一种方法的最终变量。可读性是一样的,在这种情况下,可扩展性超过了编程。
【解决方案2】:

我能想到三个地方放你的变量(都是final ofc),每个地方都有它的优点和缺点。

  1. 局部变量。
  2. 类中的私有静态字段。
  3. 某些Properties 类中的公共静态字段。

1 - 优点:变量只能在您的方法内部看到 - 代码安全性高。缺点:变量隐藏在方法中,很难找到和更改。

(我将跳过 2,因为它只是 1 和 3 之间的折衷)

3 - 优点:您的字段是其他可配置字段之一,可以轻松更改您的设置。缺点:字段是公开的,每个人都可以看到(但是Stringimmutable所以没有人可以改变它)。

总结:取决于您期望您需要更改多少变量(例如平衡、颜色更改……)。如果你确定这个字符串值是正确的,我不会害怕把它放到局部变量中。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 在这种情况下并不真正适用,因为正如问题中所写,该方法只调用一次。所以在这两种情况下只有一个分配。另外,当声明为静态时,内存不会被释放。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 1970-01-01
    • 2016-07-11
    相关资源
    最近更新 更多