Класс для строгих ссылок в Java, для анонимных классов - PullRequest
3 голосов
/ 08 сентября 2011

Мне нужна жесткая ссылка class в моем коде Java, но, конечно, ее нет.Есть ли какой-нибудь другой способ сделать то, что я хочу, или я должен создать свой собственный класс?

Это дает анонимные классы в методах, где я хочу, чтобы анонимный класс устанавливал возвращаемое значение для метода.

Например, учитывая

interface Greeting {
    void greet();
}

Мне нужен код, подобный следующему:

// Does not compile
static void hello(final String who) {
    String returnValue;

    Greeting hello = new Greeting() {
        public void greet() {
            returnValue = "hello" + who;
        }
    };
    hello.greet();
    System.out.println(returnValue);
}

Я могу подделать его, используя список:

static void hello(final String who) {
    final List<String> returnValue = new ArrayList<String>();
    Greeting hello = new Greeting() {
        public void greet() {
            returnValue.add("hello" + who);
        }
    };

    hello.greet();
    System.out.println(returnValue.iterator().next());
}

Но я хочу не использовать список.Я могу написать StrongReference класс, который решает это:

static class StrongReference<T> {
    private T referent;
    public void set(T referent) {
        this.referent = referent;
    }
    public T get() {
        return referent;
    }
}

, что делает мой метод более понятным:

static void hello(final String who) {
    final StrongReference<String> returnValue = new StrongReference<String>();
    Greeting hello = new Greeting() {
        public void greet() {
            returnValue.set("hello" + who);
        }
    };

    hello.greet();
    System.out.println(returnValue.get());
}

Для моего надуманного примера я мог бы greet() вернуть строку, но я работаю с гораздо более сложными классами, где настройка находится глубоко внутри вызова базы данных, которым управляет базовый класс.У экземпляров есть много разных типов, которые они хотят вернуть, поэтому я только что использовал трюк List.

Мои вопросы: есть ли лучший способ сделать это?Что не так с моим StrongReference классом?Кто-нибудь где-нибудь написал StrongReference в библиотеке?

Ответы [ 3 ]

7 голосов
/ 08 сентября 2011

Если вы хотите что-то из стандартного API, возможно, подойдет AtomicReference?

Он имеет void set(V value) и V get() методы. Если не задействовано несколько потоков, просто посмотрите на механизм синхронизации в качестве бонуса; -)

4 голосов
/ 09 сентября 2011

Общая идиома

final String[] result = { null };

result[0] = ...;
1 голос
/ 08 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...