将最终添加到基本类型变量使其不可变。
将最终添加到对象会阻止您更改其引用,但仍然可变。
我正在尝试使用ImageIcon作为最终常量,但与此同时,我不希望图像可以更改。是否可以将可变对象用作常量,还是有其他选择?
示例常量:
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);
答案 0 :(得分:6)
我尝试使用ImageIcon作为最终常量,但与此同时,我并不希望图像可以更改。是否可以将可变对象用作常量,还是有其他选择?
是否可以取决于你。 :-)如你所说,暴露一个可变对象的公开引用使它可以突变,所以可能不理想。
就替代方案而言:由于JButton
构造函数您正在使用accepts Icon
,而Icon
是一个非常简单的界面,没有变异方法,您可能想要自己创建一个ImmutableIcon
包装类并公开它。
E.g:
class ImmutableIcon implements Icon {
private Icon icon;
public ImmutableIcon(Icon i) {
this.icon = i;
}
public int getIconHeight() {
return this.icon.getIconHeight();
}
public int getIconWidth() {
return this.icon.getIconWidth();
}
public void paintIcon(Component c, Graphics g, int x, int y) {
this.icon.paintIcon(c, g, x, y);
}
}
然后
public static final Icon bit0 = new ImmutableIcon(new ImageIcon("bit0.png"));
答案 1 :(得分:2)
因为ImageIcon
是引用类型(而不是基元),final
这里仅表示引用将始终指向同一个对象。它没有说明该对象的状态。
如果您担心某人更改了对象的状态,您可以将其包装在您可以控制其界面的另一个对象中,或者如果您使用其他对象,则只需将其更新为Icon
图标允许,例如
public static final Icon bit0 = new ImageIcon("bit0.png");
我还要重新考虑是否需要将图标变量公开为类常量。如果你只创建一个包含类的实例,那么重用就没有节省。
至于可变类常数是否一般是正常的,我不认为有任何会议阻止它,它并不总是那么有用。而且由于它们不是垃圾收集,你必须小心不要泄漏内存。