使用可变对象作为常量

时间:2016-01-02 19:05:14

标签: java swing

最终添加到基本类型变量使其不可变
最终添加到对象会阻止您更改其引用,但仍然可变

我正在尝试使用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);

2 个答案:

答案 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");

我还要重新考虑是否需要将图标变量公开为类常量。如果你只创建一个包含类的实例,那么重用就没有节省。

至于可变类常数是否一般是正常的,我不认为有任何会议阻止它,它并不总是那么有用。而且由于它们不是垃圾收集,你必须小心不要泄漏内存。