我正在阅读代码段:
Class MyDAO{
public static final MyDAO DAO = new MyDAO();
public void loadData(){
//Hibernate Code to do something
}
...
}
所以我很惊讶,我现在面临的问题是:
as static
关键字表示可以访问"成员变量或方法,而无需对其所属的类进行实例化"。简单来说,这意味着您可以调用方法,即使您从未创建过它所属的对象。
将data member
声明为static
并实例化一个类有什么用?它是一种设计模式还是什么?最重要的是什么用途?当你说Class.staticMember
时,如何将类加载到JVM
的内存中?
答案 0 :(得分:1)
它可用于实现 Singleton 模式。
答案 1 :(得分:1)
当您希望数据成员在所有实例中保持相同的值(在类的不同对象之间共享)时,将声明该数据成员
声明静态不是设计模式,但它是设计应用程序的一种方式。
除此之外,如果您的成员仅被类中的方法使用,并且不希望直接访问它,则可以将其设置为私有静态。
答案 2 :(得分:1)
这是一种将DAO对象作为全局对象提供给应用程序其余部分的方法。它粗糙而且丑陋并且难以进行测试,因为很难提供DAO的模拟实现。
静态成员在加载类时初始化。首次引用类时会延迟加载类。应用程序中的其他类可以访问此DAO而无需初始化它。
这样的代码就是创建依赖注入框架(Spring,Guice,Hivemind等)的原因。此代码使应用程序依赖于特定实现而不是抽象,使用依赖注入通过使应用程序依赖抽象并让DI容器负责选择实现和强制执行单一范围来减少耦合并提高可测试性。
答案 3 :(得分:0)
将数据成员声明为静态并实例化一个类有什么用?
将 数据成员保持为静态不会给您任何不实例化该类的理由,因为您的类可能仍包含其他非静态成员。
当所有成员都是静态的时,例如实用程序类。一个例子是Java中的Math类。
最重要的是什么用途?
如果您的类包含非静态成员,那么如果您不实例化该类,您如何期望访问这些数据?请记住,如果未实例化它们所属的类,则非静态成员将不会存在于内存中。
它是一种设计模式还是什么?
它与设计模式没有直接关系。通常,当一个成员是类本身的行为或属性 而不是单个对象时,将其声明为静态。
当你说Class.staticMember类被加载到JVM的内存中时。
我不确切知道Java内存是如何在内部工作的,但是在对象实例化之前就存在静态成员,这意味着已经在运行时创建并加载了声明为static的变量。
这也意味着静态成员实际上属于类(不是单个实例)。