Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用可变对象作为常量_Java_Swing - Fatal编程技术网

Java 使用可变对象作为常量

Java 使用可变对象作为常量,java,swing,Java,Swing,将final添加到基元类型变量中,使其不可变 将final添加到对象可以防止更改其引用,但仍然是可变的 我试图使用作为最终常数,但同时,我不希望图像是可变的。可以将可变对象用作常量,还是有其他选择 常数示例: public static final ImageIcon bit0 = new ImageIcon("bit0.png"); public static final ImageIcon bit1 = new ImageIcon("bit1.png"); JButton button =

final添加到基元类型变量中,使其不可变
final添加到对象可以防止更改其引用,但仍然是可变的

我试图使用作为最终常数,但同时,我不希望图像是可变的。可以将可变对象用作常量,还是有其他选择

常数示例:

public static final ImageIcon bit0 = new ImageIcon("bit0.png");
public static final ImageIcon bit1 = new ImageIcon("bit1.png");
JButton button = new JButton(ClassName.bit0);
JLabel label = new JLabel(ClassName.bit1);
使用常数:

public static final ImageIcon bit0 = new ImageIcon("bit0.png");
public static final ImageIcon bit1 = new ImageIcon("bit1.png");
JButton button = new JButton(ClassName.bit0);
JLabel label = new JLabel(ClassName.bit1);

因为
ImageIcon
是一种引用类型(而不是原语),
final
此处仅表示引用将始终指向同一对象。它没有说明该对象的状态

如果您担心有人更改对象的状态,您可以将其包装到您可以控制其界面的另一个对象中,或者如果您对图标的其他使用允许,则可以简单地向上转换到
图标,例如

public static final Icon bit0 = new ImageIcon("bit0.png");
我还要重新考虑是否需要将icon变量作为类常量公开。如果您只创建了包含类的一个实例,那么重用不会带来任何节约

至于可变类常量在一般情况下是否正常,我不认为有任何惯例阻止它,只是它并不总是那么有用。由于它们不是垃圾收集的,所以必须小心不要泄漏内存

我试图使用ImageIcon作为最终常量,但同时,我不希望图像可以更改。可以将可变对象用作常量,还是有其他选择

是否可以由你决定。:-)正如您所说,公开对可变对象的公共引用会导致它发生变异,所以可能并不理想

在替代方案方面:由于您正在使用的
JButton
构造函数是一个非常简单的接口,没有任何变异方法,因此您可能希望自己创建一个
ImmutableIcon
包装类并公开它

例如:

然后


与其将图标公开,不如公开一个返回图标副本的方法。这样一来,任何人都无法更改原始图标。我已经有一段时间没有做swing了,但可能
公共静态最终图标bit0…
也会实现同样的效果
JButton
接受
图标
图标
,作为一个非常通用的界面,没有图像设置方法。(而且你总是可以从JButton实例中得到一个
图标
引用,因此图标在任何意义上都不是真正的“安全的”。@johncip Icon是一个接口,所以你不能创建它的实例。如果可能的话,这将是一个非常简单的答案。T.J.Crowder的例子就是我要说的:当然可以,但一旦创建了实例,就可以将其存储在Icon类型的变量中。我编辑了我的答案以给出一个例子。@johncip:你说得很对,将公共成员声明为
Icon
是正确的(答案有一个bug,我现在已经修复了)。在这一点上,任何把它当作其他东西的人都会进入未知的水域,所以从这个意义上说,这应该足够了。我可能仍然会做包装,所以至少他们必须玩相当广泛的反射游戏来绕过它(让私有成员可以访问,等等),但你是对的,即使是
公共静态最终图标
也已经相当强大了。好的观点。@EdwardYang:看我上面给johncip的便条。他说得很有道理。我仍然同意上面的观点,但我完全明白他的观点,从某种意义上说,即使只是声明它是图标,也已经足够了。