Java 我应该使用主模块的静态引用还是直接引用单例类?

Java 我应该使用主模块的静态引用还是直接引用单例类?,java,static,singleton,Java,Static,Singleton,好的,我将尝试建立一个简短的框架来讨论,引擎和物理都是单件的: public enum Engine { INSTANCE(); public static final Physics PHYSICS = Physics.INSTANCE; // following some private variables for the Engine instance.. private Engine() { //ctor } } 框架中的对象引用

好的,我将尝试建立一个简短的框架来讨论,引擎和物理都是单件的:

public enum Engine {
    INSTANCE();
    public static final Physics PHYSICS = Physics.INSTANCE;
    // following some private variables for the Engine instance..
    private Engine() {
        //ctor
    }
}
框架中的对象引用引擎,如下所示:

public class Object {
    public static final Engine ENGINE = Engine.INSTANCE;
这可能是来自框架中对象实例的方法:

    public void register() {
        ENGINE.register(this);
        // Now the first (1) alternative from the alternatives below:
        Engine.PHYSICS.update();
    }
由于引擎中的每个实体都是从Object派生的,所以所有对象都使用相同的静态变量共享引擎引用。到目前为止好还是不好。 现在,关于我的标题问题,关于对象如何引用引擎模块,有不同的选择:

1框架中的对象通过引擎中提供的静态变量引用引擎的其他模块,例如使用引擎物理

或者他们使用Physics.instance调用实例方法

3或另一种选择是,引擎持有一个非静态变量,例如公共最终物理=Physics.INSTANCE和objects会像这样引用物理模块:Engine.Physics


我必须承认,对于如何有效地同时使用单例引用和静态引用,我有点困惑。我知道一件事:我总是希望客户端在一个会话中使用相同的引擎和物理实例。

通常,静态引用在singleton中是私有的,因此我们可以从任何地方通过singleton.getInstance方法访问它。如果引擎singleton是框架中唯一的singleton,这会更明智更漂亮吗,自身是否正在创建非单例Physcs类的静态实例?因此,框架中的对象将被迫通过引用引擎单例来使用任何模块?从我个人的观点来看,引擎应该以非静态的方式实例化物理类。然后,您将使用Engine.getInstance.GetPhysics访问该模块。我看到的唯一缺陷是:我可能意外地在包成员中实例化了一个新的物理对象。因此,当时使用的物理与我应该使用的引擎实例完全不同。instance.Physics你是对的,但我不知道你如何“意外”实例化一个新的物理对象^^^你可能可以为你的引擎和模块创建一个特定的包,并将构造函数设置为包友好的默认访问修饰符或受保护的。这样,就不能在另一个包中创建物理对象