Java 使用生成器模式添加到集合<&燃气轮机;

Java 使用生成器模式添加到集合<&燃气轮机;,java,Java,我有一个类,它包含对象的集,我希望使该类在客户端代码完全添加到此集之前不能完全实例化。我正在考虑使用构建器模式,但不是设置集,而是考虑添加到其中,如下所示: public final class SyncManager { private ServiceManager serviceManager; private SyncManager(Builder builder) { serviceManager = new ServiceManager(builder

我有一个类,它包含对象的
,我希望使该类在客户端代码完全添加到此
之前不能完全实例化。我正在考虑使用构建器模式,但不是设置
集,而是考虑添加到其中,如下所示:

public final class SyncManager {
    private ServiceManager serviceManager;

    private SyncManager(Builder builder) {
        serviceManager = new ServiceManager(builder.services);
    }

    public static Builder newBuilder() {
        return new Builder();
    }

    /**
     * {@code SyncManager} builder static inner class.
     */
    public static final class Builder {
        private Set<Service> services;

        private Builder() {
            this.services = new HashSet<>();
        }

        /**
         * Adds the {@code services} and returns a reference to this Builder so that the methods can be chained together
         * and more services can be added.
         *
         * @param newService the {@code services} to set
         * @return a reference to this Builder
         */
        public Builder addService(Service newService) {
            services.add(newService);
            return this;
        }

        /**
         * Returns a {@code SyncManager} built from the parameters previously set.
         *
         * @return a {@code SyncManager} built with parameters of this {@code SyncManager.Builder}
         */
        public SyncManager build() {
            return new SyncManager(this);
        }
    }
}
公共最终类同步管理器{
私人服务经理;
私人同步管理器(生成器){
serviceManager=新的serviceManager(builder.services);
}
公共静态生成器newBuilder(){
返回新的生成器();
}
/**
*{@code SyncManager}生成器静态内部类。
*/
公共静态最终类生成器{
专用集服务;
私人建筑商(){
this.services=new HashSet();
}
/**
*添加{@code services}并返回对此生成器的引用,以便将这些方法链接在一起
*并且可以添加更多的服务。
*
*@param newService要设置的{@code services}
*@返回对此生成器的引用
*/
公共生成器添加服务(服务新闻服务){
添加(新闻服务);
归还这个;
}
/**
*返回根据以前设置的参数生成的{@code SyncManager}。
*
*@return使用此{@code SyncManager.Builder}的参数生成的{@code SyncManager}
*/
公共同步管理器生成(){
返回新的SyncManager(此);
}
}
}
这没关系,对吧?我正试图想出其他方法来确保
SyncManager
在需要添加到
集合中的所有内容都已就绪之前不会完全实例化。是的,我知道我可以在外部创建
,并将其传递到构造函数中的
SyncManager
,但我不想公开它


如果有更好的方法来完成我正在做的事情,任何输入都会有帮助

如果要确保集合不会在构建器/对象之外发生变化,这似乎是构建对象的一种完全合理的方法


如果要确保调用方在调用后没有修改集合,则需要从外部构造集合并将其传递到构造函数中,这需要将其复制到新集合。

IMO,如果只是使用addService builder模式,则不会增加太大的价值。@KDM您建议怎么做?我可以删除构建器,将
Set
添加到主类中,然后重复调用
addService()
方法,但这不能保证在客户端完成添加到
Set
之前实例化对象。我可以想到两个选项。一种是将集合作为参数传递。另一种方法是保持addservice&同时添加一个单独的方法来启动服务。