【发布时间】:2020-11-07 03:54:42
【问题描述】:
我有一个类,其实例已被底层 flatform 初始化和使用。
class MyAttributeConverter implements AttributeConverter<XX, YY> {
public YY convertToDatabaseColumn(XX attribute) { return null; }
public XX convertToEntityAttribute(YY dbData) { return null; }
}
没有错,我认为我需要添加一些静态方法以用作方法引用。
private static MyAttributeConverter instance;
// just a lazy-initialization;
// no synchronization is required;
// multiple instantiation is not a problem;
private static MyAttributeConverter instance() {
if (instance == null) {
instance = new MyAttributeConverter();
}
return instance;
}
// do as MyAttributeConverter::toDatabaseColumn(xx)
public static YY toDatabaseColumn(XX attribute) {
return instance().convertToDatabaseColumn(attribute);
}
public static XX toEntityAttribute(YY dbData) {
return instance().convertToEntityAttribute(attribute);
}
仍然没有任何问题(我相信),我不喜欢 instance 坚持上课,这就是我尝试这样做的原因。
private static WeakReference<MyAttributeConverter> reference;
public static <R> R applyInstance(Function<? super MyAttributeConverter, ? extends R> function) {
MyAttributeConverter referent;
if (reference == null) {
referent = new MyAttributeConverter();
refernce = new WeakReference<>(referent);
return applyInstance(function);
}
referent = reference.get();
if (referent == null) {
referent = new MyAttributeConverter();
refernce = new WeakReference<>(referent);
return applyInstance(function);
}
return function.apply(referent); // @@?
}
我基本上都不知道如何测试这段代码。我很抱歉我的问题可能有些含糊。
- 这是一种(正确/错误)方法吗?
-
reference.get()在function.apply成语中是否有可能是null? - 是否有可能出现内存泄漏等问题?
- 我应该依赖
SoftReference而不是WeakReference吗?
谢谢。
【问题讨论】:
-
这里有几个代码味道,尤其是静态状态的使用和您“需要”方法引用的概念。这似乎是一个 JPA 转换器,在这种情况下几乎没有任何意义;这些只是实现接口的普通(实例)对象。
-
我不明白你在问什么,但你将 static 字段包装在
WeakReference中?你知道那个静态的referent什么时候会消失吗? -
MyAttributeConveter和MyAttributeConverter一样吗?我问是因为你多次使用这两个不同的标识符,编译器通常会告诉你一个是否是另一个拼写错误的版本。 -
@Holger 是的,伙计!有错别字。
标签: java weak-references soft-references