正在将构造函数隐藏在包外部



我试图将类构造函数隐藏在包范围之外(以及其他一些setter),并强制潜在的包用户仅通过其生成器来获取此特定类(出于清晰和验证的原因)。

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

我很好奇有没有其他解决方案或模式?不久前,我听说有传言说要在Java中引入"模块"可见性修饰符(我认为这会解决问题),但我想他们放弃了这个想法。

-使用protected访问修饰符来限制该包之外的构造函数代码的访问。

例如:

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

我对Java没有太多的了解,但我相信您可以声明一个静态方法来创建类的实例

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

这样,你就可以只从同一个包中创建一个类的新实例,并且可以在没有任何限制的情况下扩展该类

使用公共生成器静态内部类:

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中的字段设置为最终

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

如果您想将客户端正在使用的构建器接口与产品分离,那么添加该间接层。

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

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

或者,您可以使用一个带有"get"方法的接口(去掉get前缀,这在get类型中毫无意义)来替换构造函数中的每个参数。产品构造函数现在只需要一个参数,并且可以拉取每个参数。每个构建器都可以在完成产品构建时将接口实现为匿名内部类。

最新更新