【发布时间】:2020-03-19 23:55:39
【问题描述】:
让我们定义一个类,使得多个实例变量只能延迟初始化一次,就像这个类:
public class MyClass {
private Object myLazyField;
private Integer anotherLazyField;
public Object getMyLazyField() {
if (myLazyField == null) {
synchronized (this) {
if (myLazyField == null) {
myLazyField = new Object();
}
}
}
return myLazyField;
}
public Integer getAnotherLazyField() {
if (anotherLazyField == null) {
synchronized (this) {
if (anotherLazyField == null) {
anotherLazyField = 10;
}
}
}
return anotherLazyField;
}
}
代码相当丑陋,初始化结构重复。
我的问题是:如何简化延迟初始化,避免结构重复?
我试过了:
class Utility {
public static <T> T init(Object object, T initialValue, Supplier<T> supplier) {
synchronized (object) {
if (initialValue == null) {
return supplier.get();
}
}
return initialValue;
}
}
在MyClass:
public Object getMyLazyField() {
if (myLazyField == null) {
myLazyField = Utility.init(this, myLazyField, Object::new);
}
return myLazyField;
}
更好,但我仍在寻找使用函数式编程的更好解决方案。
【问题讨论】:
-
我不明白为什么你觉得第一个解决方案很丑。当然,重复的代码语句
if (anotherLazyField == null) {可以去掉。除此之外,它只有 3 行代码。您是否试图概括多个字段的延迟初始化? -
我不是 Java 注释处理方面的专家,但我相信您可以编写一个处理器,它会自动为带有适当注释的 getter 方法添加惰性。类似于不可变或自动值。
-
@dash-o 这绝对是个好主意。
标签: java functional-programming