我想在我的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()返回一个String,但是我正在处理更复杂的类,其中的设置位于基类管理的数据库调用中。这些实例有许多不同的类型要返回,因此我一直在使用List技巧。

我的问题是:是否有更好的方法可以做到这一点?我的StrongReference类怎么了?有没有人在某个地方的图书馆写过StrongReference

最佳答案

如果您想从标准API中获取某些东西,也许 AtomicReference 可以吗?

它具有void set(V value)V get()方法。除非您涉及多个线程,否则请仅将同步机制视为奖励;-)

07-27 17:43