只有一个类可以实例化所有其他类

时间:2019-05-07 09:07:01

标签: java

什么是将类的实例限制为一个类的最佳实践?类似于this,但使用Java。

假设有Main类,然后有User,Admin,View,Data,Client等类。只有“ Main”类应该能够实例化所有其他类。

因此,如果“用户”需要在“数据”类中调用“ getUser”方法,则无法实例化“数据”类和调用方法,但必须调用“主”类,然后“主”将实例化“ Data”类并将参数传递给其“ getUser”方法。

我正在考虑使用私有构造函数,工厂模式等,但是不确定是否会导致我需要的结果。由于复杂性,我认为内部类不是一个好的解决方案。

对此有何建议?

3 个答案:

答案 0 :(得分:2)

在概念上有一个独特的答案(因为在技术上“如何做到”已经有了很好的答案):

  

假设有Main类,然后有User,Admin,View,Data,Client等类。只有“ Main”类应该能够实例化所有其他类。

我认为这不是一个好的起点。当然,当人们遵循域驱动设计时,使用factories的做法已经很成熟。

但是要添加一个微妙的要点:您仍然希望以合理的方式削减“边界”。含义:不要强迫所有对象进入单个工厂。您的对象应该以某种方式类似于它们的域,并在需要时分开。

意思是:使用工厂很好,但不要强迫自己确实存在一个一个工厂来应对各种您处理的对象。取而代之的是:尝试合理地划分对象模型,并在概念上拥有尽可能多的工厂。

还请注意,您可能应该区分主要提供数据/信息的对象和最后具有“行为”的对象。因此,值得考虑使用服务注册中心的想法(例如,您使用netflix Eureka框架进行的操作,请参见here)。

最后,在这里引用tucuxi给出的出色评论:对于小型应用程序,工厂过度设计。对于大型应用程序,我发现只有一个名为“ Main”的工厂存在问题,而不是以更传统的方式划分职责。

答案 1 :(得分:0)

您可以将子类与私有构造函数一起使用: 这样,只有InstantiatonClass可以创建InstantiatonClass.ArgClass和ProtectedClass的构造函数。

public class ProtectedClass{
    //constructor that can only be invoked with an instance of ArgClass 
    public ProtectedClass(InstantiatonClass.ArgClass checkArg){}
}
public class InstantiatonClass{
    public static class ArgClass{
    //constructor that can only be invoked from InstantiatonClass
        private ArgClass(){}
    }
}

答案 2 :(得分:0)

您应该能够在Class的构造函数中获取调用者的类:

How to get the name of the calling class in Java?

然后在只希望由Main实例化的类中,只需检查调用方类在其构造函数中是否为Main,如果没有抛出RuntimeException的话。