【问题标题】:final variable assignment: at declaration or in constructor?最终变量赋值:在声明中还是在构造函数中?
【发布时间】:2012-04-23 00:48:35
【问题描述】:

首先,这不是Initialize final variable before constructor in Java 的完全重复。这可能是相关的,但没有任何答案让我满意。

我的问题是关于 Swing GUI 中的最终变量。特别是关于自定义Actions。 我有许多 final 变量和许多 static final 变量。

问题是:如果变量实际上是一个常量,那么更好的是:在构造时初始化它们,还是在声明时初始化它们?

我上面提到的问题的答案通常指向在声明变量时尽快分配变量static。这对我来说真的没有意义,因为变量没有在静态上下文中使用。我有几个我的表单使用的图像,例如图标,我将它们设为静态,因为除非您的应用程序修改它们,否则图像只是静态的东西。这是有道理的。

另一方面,Actions 是自定义内部类的新实例。从技术上讲,它们也是静态的,但感觉不同。它们只是不得在静态上下文 imo 中可用。我也这么说:

private final CustomAction customAction = new CustomAction();

或者我在构造函数中初始化它?哪个更好?还是我对static 的看法有误?

【问题讨论】:

  • +1 提前进行研究
  • 如果您在代码初始化时知道​​该值,请在声明时对其进行初始化。其他在施工。

标签: java variables static constants


【解决方案1】:

如果该字段是常量,则使其成为类的static final 成员,

public class Foo{
    public static final int BAR = ...;
}

否则,在构造函数中初始化字段。

【讨论】:

  • 你是第 n 个这么说的人,尽管没有人说出确切的原因,也没有人证明这种做法是正确的。
  • @MarioDeSchaepmeester,请参阅this
  • @MarioDeSchaepmeester 如果它是常量,为什么每次调用构造函数时都要重新初始化它?有大量的理由,mre 发布的链接是一个好的开始。
  • @mre 好吧,该链接完善了我对静态真正含义的想法。感谢您的参考。
  • @milkplusvellocet,在构造函数中初始化允许不同的构造函数对其初始化不同的值
【解决方案2】:

在声明时初始化常量变量:它更具可读性。如果为类的不同实例放入不同的值没有任何意义,则将其设为静态,也就是说,如果它是类级别的变量,而不是实例级别。

【讨论】:

    【解决方案3】:

    我认为您没有将其设为静态是正确的,因为听起来您的 CustomAction 对象是真正为在其构造函数中创建它们的 GUI 实例定制的。我认为你是否在构造函数中初始化它取决于你的构造函数是否可以根据构造函数的输入参数以不同的方式初始化CustomAction

    static 与非静态的比较...一个好的经验法则是,如果一个变量要在特定对象类型的所有实例中保持不变,那么该变量应该是 static。这在程序运行时节省了内存,并且在构造每个对象实例时也节省了 CPU 时间,因为每次创建一个您的对象的新实例。另一方面,如果一个变量对于对象的特定实例保持不变,但可能因实例而异,那么它不应该是静态的。

    最后(双关语),只要您不希望原始值或对 Object 的引用发生变化,就应该使用final。静态或非静态上下文并不会真正影响变量是否应该是final,严格来说是final,因为开发人员不想更改该变量。它的静态上下文完全取决于开发人员希望如何访问它。

    【讨论】:

      【解决方案4】:

      对于快速的应用程序启动和用户可能不访问的程序部分(关于对话框),静态是不好的。一般来说,静态并不像您发现的那样非常受欢迎。有一些原因,但没有什么非常令人信服的。但有时它是一种反模式或它的标志。

      在你的情况下,我还是会避免使用静态图像。顺便说一下,资源是在内部缓存的。

      【讨论】:

      • 这相当令人困惑......如果您的应用程序需要一组在应用程序运行时保持不变的图像(例如,如果我有一个工具栏在我的应用程序中出现几次,但包含按钮中的所有相同图标),为什么不静态加载它们?
      • 一个立即可见的工具栏,是的。当然,无论是静态创建还是工具栏创建时,这里都没有区别。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多