Sharing Realm fields on Android

我与影子孤独终老i 提交于 2019-11-29 16:08:50

If you use Kotlin, sharing the fields via an interface becomes even more trivial:

interface PersonBase {
    var name: String?
    var salary: Int
}

Then

class Person: RealmObject(), PersonBase {
}

I had the same issue when I found out that realmObjects should inherit directly form RealmObject class (no support for inheritance). In order to get back the benefits of polymorphism, I considered a similar solution to yours combined with some composition tricks that would avoid me attribute duplication.

"Talk is cheap show me the code."

Code examples

interface IPerson {
    String getName();
}

class Person extends RealmObject implements IPerson {

    String name;

    @Override
    public String getName() {
        return name;
    }
}

interface IWorker extends IPerson {
    int getSalary();
}

class Worker extends RealmObject implements IWorker {

    Person person;
    int salary;

    @Override
    public String getName() {
        return person.getName();
    }

    @Override
    public int getSalary() {
        return salary;
    }
}

Some benefits

You won't have to duplicate your attributes in each extending class.

Polymorphism is back! For example, now you can simulate a cast (with getPerson() in this example).

Some limits

When using a serialization library that uses reflection (suppose it's Gson), your serialized models will have their parents attributes embedded. Not something that you would have had if you were using classic inheritance.

Example with JSON

Let's suppose John Doe is making 500$ a month. (He's a Worker and a Person right?).

With classic inheritance, John Doe would look like this:

{
  "name":"John Doe",
  "salary": 500
}

But with this inheritance workaround ... :

{
  "person" : {
  "name":"John Doe"
  },
  "salary": 500
}

Hope this helps!

Note

PrimaryKeys unfortunately have to be duplicated.

Bonus

You might want to check RealmFieldNamesHelper, a library made by Christian Melchior "to make Realm queries more type safe".

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!