【问题标题】:Class that extends RealmObject as a singleton将 RealmObject 扩展为单例的类
【发布时间】:2016-12-07 13:01:02
【问题描述】:

我的 Android 应用程序中有一个配置类,我存储在 Realm 数据库中。我只是对其进行了编辑以遵循单例设计模式,因此配置实例只有一次。

问题是,该类现在有一个私有构造函数来防止实例化,而无需调用我的“getInstance”方法。但是,RealmObject 似乎需要一个公共构造函数。

难道不能有一个使用单例设计模式扩展 RealmObject 的类吗?

这仅仅是我必须考虑的 Realm 限制吗?

这是上下文的 sn-p 代码:

public static  AppConfiguration getInstance(){
    if(configuration == null){
        synchronized (AppConfiguration.class) {
            if (configuration == null) {
                configuration = new AppConfiguration();
            }
        }
    }
    return configuration;
}

//constructor is private to prevent instantiation without using getInstance, enforces singleton
private AppConfiguration() { //The constructor defined as private which is causing the problem
    this.isRegistered = false;
    this.isLoggedIn = false;
}

【问题讨论】:

    标签: java android constructor singleton realm


    【解决方案1】:

    从概念上讲,您的单例设置在 Realm 的上下文中没有意义,因为您同步了一个非托管对象(因此通过互斥/锁定允许“一次只有一个线程访问它”),这就提出了一个问题:

    • 如果对象是非托管的,那么为什么它是RealmObject? (Realm 允许与其 MVCC 架构保持一致,如果您使用分离副本,那么为什么要使用 Realm 来实现其持久性?)
    • 如果对象被管理,那么您将如何从多个线程访问它? (托管 RealmObjects 是线程受限的~你需要将其设为 ThreadLocal,并在其 Realm 关闭时将其清除)

    但是,是的,您需要 RealmObject 的公共构造函数,以便 Realm 可以实例化其代理实例。也许你可以试试protected 构造函数,看看如果你这样做,RealmProxy 是否可以通过反射来实例化。

    【讨论】:

    • 我的想法是我会在应用程序启动时创建一个对象的单个实例。这个单一实例将被持久化在 Realm 中,但如果我需要在其他任何地方访问该实例,也可以使用它,而无需从 Realm 数据库中读取它。我希望将 AppConfiguration 存储在 Realm 数据库中以在会话之间保持不变。简单地使用 Realm 存储的版本并在需要时从 Realm 数据库中创建/读取/更新/删除会更有意义吗?
    • also be available if I should need to access the instance anywhere else, without having to read it from the Realm database. 您只能在访问字段时从 Realm 读取,但实际上这是主要的好处 - 您总是在任何地方看到相同的对象。在我看来,如果这种同步是你想要的方式,那么你应该将它作为 JSON 或类似的东西持久保存到共享首选项中,如果你没有实际使用,那么将 Realm 添加到这个对象并没有多大意义用它来做任何事。
    • Realm 旨在允许自动更新后台线程上发生的数据库写入。如果您不听此对象的更改,并且不需要对其进行管理以实现该目标,那么最好将其设置为 POJO,对吗? :p
    • 你是完全正确的,当它们不适合时,我试图将单例和 Realm 楔在一起!我觉得我想坚持为此使用 Realm(我需要学习如何正确使用它!)所以我删除了单例和同步部分,并在配置对象上为 Realm 异步 CRUD 设置了一个 DAO。希望这是正确的方法,而且我还没有掉进另一个兔子洞!
    • 好吧,看看我的个人资料页面上的一些文章,它们可能会有所帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2010-12-14
    相关资源
    最近更新 更多