2016-01-02 6 views
4

Добавление 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); 
+4

Вместо того, чтобы значок общественности, сделать публичный метод, который возвращает копию иконы. Таким образом, оригинал не может быть изменен никем. – azurefrog

ответ

6

Я пытаюсь использовать ImageIcon в качестве конечной константы, но в то же время я не хочу, чтобы изображение было изменчивым. Можно ли просто использовать изменяемые объекты в качестве константы или есть альтернативы?

Все зависит от вас. :-) Публикация публичной ссылки на изменяемый объект оставляет ее открытой для мутации, как вы сказали, поэтому, вероятно, не идеальна.

С точки зрения альтернатив: Поскольку JButton конструктор вы используете accepts 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")); 
+0

Я не делал качели через некоторое время, но, возможно, «public static final Icon bit0 ...» достигнет того же. 'JButton' принимает' Icon' и 'Icon', будучи очень общим интерфейсом, не имеет методов настройки изображения. (И вы всегда можете вернуть ссылку «Значок» из экземпляра JButton, поэтому значок в действительности не является «безопасным».) – johncip

+0

@johncip Icon - это интерфейс, поэтому вы не можете создать экземпляр из этого. Если только это возможно, это был бы такой простой ответ. T.J. Пример Кроудера - это то, с чем я иду. : ') –

+0

Конечно, но как только вы сделали экземпляр, вы можете сохранить его в переменной типа Icon. Я отредактировал свой ответ, чтобы привести пример. – johncip

2

Поскольку ImageIcon является ссылочным типом (вместо примитивной), final здесь означает только то, что ссылка всегда будет указывать на то же самое объект. Он ничего не говорит о состоянии этого объекта.

Если вы обеспокоены тем, что кто-то изменил состояние объекта, вы можете перенести его в другой объект, интерфейс которого вы контролируете, или просто повышаете до Icon, если это разрешено другим вашим использованием значка, например.

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

Я бы также пересмотрел, нужно ли выставлять переменную значка как константу класса. Если вы только когда-либо делаете один экземпляр класса, содержащего класс, тогда нет никакой экономии от повторного использования.

Что касается того, являются ли изменяемые константы классов вообще в общем, я не думаю, что существует какое-либо соглашение, обескураживающее его, это не всегда полезно. И поскольку они не собираются с мусором, вы должны быть осторожны, чтобы не просачивать память.

Смежные вопросы