Изменяемые константы внутри интерфейса - PullRequest
2 голосов
/ 29 августа 2011

Я знаю, что на основе руководств по Java :

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

Возможно ли сделать значения внутри интерфейса общими и изменяемыми для всех классов, которые реализуют указанный интерфейс?

Ответы [ 4 ]

9 голосов
/ 29 августа 2011

Теоретически, да, если вы используете изменяемый тип для вашей «константы», например, AtomicReference.
Однако это будет ужасный дизайн!

public interface MyInterface{
    AtomicReference<String> NAME = new AtomicReference<String>("Fred");
}


public static void main(final String[] args){
    System.out.println(MyInterface.NAME);
    MyInterface.NAME.set("Jim");
    System.out.println(MyInterface.NAME);
}

Вывод:

Фред
Джим

Вы можете использовать Коллекции, Карты, Массивы или любой другой тип, который изменчиво содержит значения дляэтот образец, однако я бы серьезно попросил вас переосмыслить его.

1 голос
/ 29 августа 2011

Вы не должны этого хотеть :), это было бы большим хаком.

Использование абстрактного класса вместо интерфейсов для создания изменяемых значений - конечно, если вы можете использовать абстрактный класс в своем дизайне.

1 голос
/ 29 августа 2011

Возможно ли сделать значения внутри интерфейса общими и модифицируется всеми классами, которые реализуют указанный интерфейс?

Класс, который реализует интерфейс, видит константу, но константа является окончательной (создается один раз и никогда не объявляется повторно). Если ваша константа является объектом типа List, вы можете добавлять / удалять объекты из него.

0 голосов
/ 29 августа 2011

Ваш интерфейс может объявлять методы доступа для значений, которые вы хотите изменить. Вместо того, чтобы напрямую ссылаться на константы, вы можете вызвать методы доступа, чтобы получить и установить значения. Эти значения на самом деле являются членами классов, которые реализовали интерфейс. Хотя они могут или не могут быть статичными, они не обязательно должны быть окончательными.

...