隐藏构造函数在包之外

时间:2012-11-23 12:42:00

标签: java oop

我正在尝试隐藏包范围之外的类构造函数(以及一些其他setter)并强制潜在的包用户仅通过其构建器获取此特定类(为了清晰和验证原因)。

到目前为止,我已经通过将该类及其构建器放在同一个包中并声明我想隐藏的所有方法的包可见性来实现这一目标。然而,这有一些缺点。它强加了更严格的包结构,并限制了用户扩展类构建器的可能性。

我对任何替代解决方案或模式感到好奇吗?我刚才听说过有关向Java引入“模块”可见性修饰符的传言(我认为这会解决问题),但我猜他们放弃了这个想法。

4 个答案:

答案 0 :(得分:1)

- 使用protected access-modifier 限制对该程序包外部的构造函数代码的访问。

<强>例如

public class FilePro {

    protected FilePro(){      // This block is accessible only
                          // within this package

    }

}

答案 1 :(得分:0)

使用公共构建器静态内部类:

public class OuterClass{

    private MyType1 field1;
    private MyType2 field2;

    private OuterClass(MyType1 field1, MyType2 field2){....} 

    public static class Builder{
        private static final MyType1 DEFAULT_VALUE_1 = something;
        private static final MyType2 DEFAULT_VALUE_2 = somethingelse;

        private MyType1 field1=DEFAULT_VALUE_1;
        private MyType2 field2=DEFAULT_VALUE_2;

        public Builder() {...}

        public setFiled1(MyType1 field1) { this.field1 = field1)
        public setFiled2(MyType2 field2) { this.field2 = field2)

        public OuterClass build() { return new OuterClass(field1,field2);}
    }
}

为了进一步提高稳健性,请将您的字段设置为outerClass final

答案 2 :(得分:0)

我没有用Java做过那么多,但我相信你能做的就是声明一个创建类实例的静态方法

public static build()
{
 return new FilePro();
}

这样你就可以从同一个包中创建一个新的类实例,你可以不受任何限制地扩展类

答案 3 :(得分:0)

首先,我建议在产品中进行完整验证(以及复制可变值),而不是信任客户。

如果要将客户端正在使用的构建器接口与产品分开,请添加该间接层。

最简单的方法是让产品公开具有巨大参数列表的构造函数,并执行通常的构造函数职责(复制可变,验证参数并确保将对象初始化为可用状态)。构建器可以位于不同的依赖包/模块/ jar /库中,并使用构造函数接口。

所以现在我们回到了大建设者那里。您可以通过多种方式解决此问题。例如,你可以在同一个类/包/模块中有一个规范构建器,其他对象可以使用它。

或者你可以有一个带有“get”方法的接口(删除get前缀,它在一个获取类型中毫无意义)替换构造函数中的每个参数。产品构造函数现在只需要一个参数,并且可以提取每个参数。在完成产品构建时,每个构建器都可以将接口实现为匿名内部类(比如说)。