最终变量赋值:在声明或构造函数中?

时间:2012-04-10 17:38:21

标签: java variables static constants

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

我的问题是关于Swing GUI的最终变量。它特别关注自定义Action。 我有许多final个变量和一些static final变量。

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

我在上面提到的问题上的答案通常指向在您声明变量static后立即指定变量Action。这对我来说并不合理,因为变量不在静态上下文中使用。我有几个图像,我的表单使用像图标,我做了那些静态因为图像只是一个静态的东西,除非你的应用程序修改它们。这是有道理的。

另一方面,private final CustomAction customAction = new CustomAction(); 是自定义内部类的新实例。在技​​术上它们也是静态的,但它只是感觉不同。他们只是不能在静态上下文imo中可用。所以我把:

static

或者我在构造函数中初始化它?哪个更好?或者我在考虑{{1}}错误的方式?

4 个答案:

答案 0 :(得分:5)

如果该字段是常量,请将其设为该类的static final成员,

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

关于static与非静态的关系......一个好的经验法则是,如果变量在特定对象类型的所有实例中保持不变,那么该变量应为{{1 }}。这个节省了内存超过了程序的运行时间,并且节省了CPU时间在构造每个对象实例时,因为每次创建一个对象实例时都不需要初始化该常量对象的新实例。另一方面,如果变量对于特定的Object实例保持不变,但可能与实例不同,那么它不应该是静态的。

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

答案 3 :(得分:0)

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

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