首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单例模式+不可避免的公共建设者

单例模式+不可避免的公共建设者
EN

Code Review用户
提问于 2016-11-23 06:15:16
回答 2查看 428关注 0票数 4

在将对象存储到数据库之前,需要将其转换为不同的类型。为此,库在字段上提供了一个注释,指定用于来回转换的适当类给定为ClassName.class。

这个类实现了一个库的接口,其中包含了marshall & unmarshall方法。

代码语言:javascript
复制
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字段,并在需要的地方使用它,以避免每次都创建它。但是,我的论点是,没有人停止创建一个新实例,从而破坏了静态实例的用途。

一个更好的方法来处理这个问题,如果创建对象的代价真的很高的话,那就是拥有一个具有静态方法的工具类来进行来回转换。可以在封送处理程序和手动转换过程中调用它们。有什么更好的方法吗?

同时拥有静态实例和公共构造函数是一个很好的实践吗?

EN

回答 2

Code Review用户

发布于 2016-11-23 07:07:45

问题是:你想实现什么?

当您将单例存储在数据库中时,在我看来,您的单例似乎是语义性的,而不是技术性的。

技术单例具有静态实例字段的统一结构,可能是延迟初始化和私有构造函数,以确保每个JVM只有一个实例。

在JVM中,语义单例中的每个对象标识都没有唯一的断言。它们的断言是,它们在任何地方的行为都是相同的,并且它们在任何JVM中都具有语义标识(等于),以确保超越JVM边界的标识。

通常,这种单例通常有一个到域/模块的中心入口点。

为了避免语义单例中的公共构造函数,我将需求“中心入口点”与“对象实例化”分开。在我的设计中,我有一个SingletonX类,它嵌入“中心入口点”。此外,我有一个或多或少是POJO的类X,最后,我有一个接口InterfaceX来重新定义X类的公共接口。类X应该在运行时解析,并且大部分超出范围,可以通过客户端代码实例化。类X是要序列化的类。

票数 1
EN

Code Review用户

发布于 2016-11-23 17:06:55

那经典的单例枚举呢?

代码语言:javascript
复制
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);
        }
    }
}

示例用法

代码语言:javascript
复制
InstantMarshaller.INSTANCE.marshall(obj);
InstantMarshaller.INSTANCE.unmarshall(string);

有效的Java是一本好书。

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/147847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档