在将对象存储到数据库之前,需要将其转换为不同的类型。为此,库在字段上提供了一个注释,指定用于来回转换的适当类给定为ClassName.class。
这个类实现了一个库的接口,其中包含了marshall & unmarshall方法。
public class ObjectConverter implements Marshaller<Instant> {
public static final ObjectConverter CONVERTER = new ObjectConverter();
@Override
public String marshall(Instant obj) {
return obj.toString();
}
@Override
public Instant unmarshall(Class<Instant> clazz, String obj) {
return Instant.parse(obj);
}
}现在,我们需要在某些地方手动将Instant转换为适当的类型。一种直截了当的方法是到处创建一个新实例并调用这些公共方法。
我的同事建议自己有一个static final字段,并在需要的地方使用它,以避免每次都创建它。但是,我的论点是,没有人停止创建一个新实例,从而破坏了静态实例的用途。
一个更好的方法来处理这个问题,如果创建对象的代价真的很高的话,那就是拥有一个具有静态方法的工具类来进行来回转换。可以在封送处理程序和手动转换过程中调用它们。有什么更好的方法吗?
同时拥有静态实例和公共构造函数是一个很好的实践吗?
发布于 2016-11-23 07:07:45
问题是:你想实现什么?
当您将单例存储在数据库中时,在我看来,您的单例似乎是语义性的,而不是技术性的。
技术单例具有静态实例字段的统一结构,可能是延迟初始化和私有构造函数,以确保每个JVM只有一个实例。
在JVM中,语义单例中的每个对象标识都没有唯一的断言。它们的断言是,它们在任何地方的行为都是相同的,并且它们在任何JVM中都具有语义标识(等于),以确保超越JVM边界的标识。
通常,这种单例通常有一个到域/模块的中心入口点。
为了避免语义单例中的公共构造函数,我将需求“中心入口点”与“对象实例化”分开。在我的设计中,我有一个SingletonX类,它嵌入“中心入口点”。此外,我有一个或多或少是POJO的类X,最后,我有一个接口InterfaceX来重新定义X类的公共接口。类X应该在运行时解析,并且大部分超出范围,可以通过客户端代码实例化。类X是要序列化的类。
发布于 2016-11-23 17:06:55
那经典的单例枚举呢?
public enum InstantMarshaller implements Marshaller<Instant> {
INSTANCE {
@Override
public String marshall(Instant instantObj) {
return obj.toString();
}
@Override
public Instant unmarshall(String stringValue) {
return Instant.parse(obj);
}
}
}示例用法
InstantMarshaller.INSTANCE.marshall(obj);
InstantMarshaller.INSTANCE.unmarshall(string);有效的Java是一本好书。
https://codereview.stackexchange.com/questions/147847
复制相似问题