如何在android中使用参数设计lazy holder模式?

如何在android中使用参数设计lazy holder模式?,android,Android,我想知道如何用参数设计lazyholder单例模式。 我只知道没有争论的时候,但不知道有争论的时候。 当constructprivate static final DBHelper INSTANCE=new DBHelper()时,问题如下所示 我怎样才能解决它 public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(con

我想知道如何用参数设计lazyholder单例模式。 我只知道没有争论的时候,但不知道有争论的时候。 当construct
private static final DBHelper INSTANCE=new DBHelper()时,问题如下所示
我怎样才能解决它

  public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        this.context=context;
    }

    public static DBHelper getInstance(){
        return DBHelper.DBHelperHolder.INSTANCE;
    }

    private static class  DBHelperHolder{
        private static final DBHelper INSTANCE = new DBHelper();
    }

您可以使用DCL模式,例如:

public class DBHelper {
    private static volatile DBHelper instance;
    public static DBHelper getInstance(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        if (instance == null) {
            synchronized (DBHelper .class) {
                if (instance == null) {
                    instance = new DBHelper(context, name, factory, version);
                }
            }
        }
        return instance;
    }
}

但是,除了@bracadbra的答案之外,每次调用
getInstance

时都需要提供参数

  • 建议添加
    私有构造函数()
  • 我更喜欢
    LOCK
    对象进行
    synchronization
    (线程安全)
  • 我们还应该限制
    clone()
    调用,以便外部代码不能通过
    .clone()
    调用来克隆此类。因此,重写
    clone()
    方法并从中返回
    CloneNotSupportedException()

    public class DBHelper {
    
    private static DBHelper instance;
    
    // LOCK object for synchronisation
    private static Object LOCK = new Object();
    
    // Private Constructor
    private DBHelper() { }
    
    public static DBHelper getInstance(Context context, String name, 
        SQLiteDatabase.CursorFactory factory, int version) {
        if (instance == null) {
            synchronized (LOCK) {
                if (instance == null) {
                    instance = new DBHelper(context, name, factory, version);
                }
            }
        }
        return instance;
    }
    
    @Override
    protected DBHelper clone() throws CloneNotSupportedException {
        return CloneNotSupportedException();
    }
    

这是否回答了您的问题?如果我的回答解决了你的问题,请接受我的回答。谢谢