簡體   English   中英

使用可變對象作為常量

[英]Using mutable objects as a constant

final添加到基本類型變量使其不可變
final添加到對象會阻止您更改其引用 ,但仍然是可變的

我正在嘗試使用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);

我正在嘗試使用ImageIcon作為最終常量,但與此同時,我不希望圖像可以更改。 是否可以將可變對象用作常量,還是有其他選擇?

是否可以取決於你。 :-)如你所說,暴露一個可變對象的公共引用使它可以突變,所以可能不理想。

在替代方面:由於您使用的JButton構造函數接受Icon ,而Icon是一個非常簡單的接口,沒有變異方法,您可能想要自己創建一個ImmutableIcon包裝類並公開它。

例如:

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

因為ImageIcon是引用類型(而不是基本類型),所以final在這里僅表示引用將始終指向同一個對象。 它沒有說明該對象的狀態。

如果您擔心某人更改了對象的狀態,您可以將其包裝在您可以控制其界面的另一個對象中,或者如果您對該圖標的其他用途允許,則只需將其更新為Icon ,例如

public static final Icon bit0 = new ImageIcon("bit0.png");

我還要重新考慮是否需要將icon變量公開為類常量。 如果你只創建一個包含類的實例,那么重用就沒有節省。

至於可變類常量是否一般是正常的,我認為沒有任何慣例阻止它,它並不總是那么有用。 而且由於它們不是垃圾收集,你必須小心不要泄漏內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM