[英]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.