Java中的静态变量用法-对象从不更改

Java中的静态变量用法-对象从不更改,java,static,Java,Static,我被分配了一个IT项目,在这个项目中,我们必须编写各种不同的GUI来完成各种事情。我们也在使用一个数据库。假设我们正在访问名为“数据库”的类中的“EntityManager”: 假设我在“GUI1”中,我想切换到“GUI3”。初始化“GUI3”后,我必须通过“setDatabase()”方法将“myDatabase”引用传递给它,但如果我想返回“GUI1”,我必须再次传递回数据库引用 到目前为止,我已经有了大约15个GUI,当我知道可以很容易地替换它们时,复制并粘贴相同的代码会让人很恼火。在这种

我被分配了一个IT项目,在这个项目中,我们必须编写各种不同的GUI来完成各种事情。我们也在使用一个数据库。假设我们正在访问名为“数据库”的类中的“EntityManager”:

假设我在“GUI1”中,我想切换到“GUI3”。初始化“GUI3”后,我必须通过“setDatabase()”方法将“myDatabase”引用传递给它,但如果我想返回“GUI1”,我必须再次传递回数据库引用


到目前为止,我已经有了大约15个GUI,当我知道可以很容易地替换它们时,复制并粘贴相同的代码会让人很恼火。在这种情况下,在“Database”类中使用对我想要的任何内容的静态引用,而不是在所有“GUI*”类之间传递引用,这难道不是正确的吗

创建一个singleton数据库对象,其中每个人都访问同一个对象:

public class Database {

    private Database(){ // privatize the constructor
        // your code here
    }


    private static Database INSTANCE;
    public static Database getInstance() {
        if(INSTANCE == null) {
            // let's make it thread-safe
            synchronized(Database.class) {
                if(INSTANCE == null) // may have changed in the mean while
                                     // by other thread
                    INSTANCE = new Database();
            }
        }
        return INSTANCE;
    }

}

编辑:从线程安全的角度来看,更好的是
enum

public enum Database {

    INSTANCE(); // pair of parenthesis, for constructor

    Database() { // constructor
        // your code here
    }

    public static Database getInstance() {
        return INSTANCE;// initialization controlled by system
    }

    public void someMethod(){
        // even allows you to add custom methods
    }

}

你考虑过制作一个
AbstractGUI
基类来包含共享代码吗?这正是我首先做的,但后来我的老师说根据OOP原则这是不正确的。。。我只是想验证一下,这个方法是否正确?我怀疑它会破坏OOP。瞧,Java提供了
enum
,实际上就是这样。(从线程安全的角度来看,甚至比我的示例更好)。想一想,我要编辑我的帖子来反映它。@Downvotter请评论。
public enum Database {

    INSTANCE(); // pair of parenthesis, for constructor

    Database() { // constructor
        // your code here
    }

    public static Database getInstance() {
        return INSTANCE;// initialization controlled by system
    }

    public void someMethod(){
        // even allows you to add custom methods
    }

}