我想在我的Java代码中使用硬引用 class ,但是,当然,没有一个。有没有其他方法可以做我想要的,或者我应该自己上课?
这会在方法中提供匿名类,我希望匿名类为方法设置返回值。
例如,给定
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
?
答案 0 :(得分:7)
如果您需要标准API中的某些内容,或许AtomicReference
会这样做吗?
它有void set(V value)
和V get()
方法。除非您涉及多个线程,否则只需将同步机制视为奖励; - )
答案 1 :(得分:4)
一个常见的习语
final String[] result = { null };
result[0] = ...;
答案 2 :(得分:1)
看起来不错,但我认为您应该进行某种同步,因为另一个线程可能会设置该值。