Класс данных Kotlin v / s открытый класс? - PullRequest
1 голос
/ 15 июня 2019

Когда я преобразовываю свой проект Java в проект Kotlin, я пришел знать о классах данных в kotlin (замена классов модели Java).

Теперь у меня есть требование, чтобы мой kotlin data class поддерживал RealmObject, но по ссылке Класс данных Kotlin для RealmObject , он говорит, что классы данных, очевидно, не поддерживаются в Realm, поэтому мне нужно сделать мой data class как open class.

Итак, я хочу знать разницу между этими двумя терминами.

1 Ответ

3 голосов
/ 15 июня 2019

Данные классы предназначены для хранения значений.В смысле Java Bean, их основная цель - обернуть вокруг некоторый набор значений.

Что делает Java bean действительно уродливым, так это то, что многие важные методы, такие как equals(), hashcode() или toString(), в идеале должен знать о полях вашего класса ... наследуются от java.lang.Object.И поэтому они не делают ничего полезного.

Когда вы объявляете data class в Kotlin, компилятор Kotlin просто добавляет разумную реализацию для всех этих методов.См. kotlin-lang :

Компилятор автоматически извлекает следующие члены из всех свойств, объявленных в первичном конструкторе:

  • equals () / hashCode() пара;
  • toString () в форме «Пользователь (имя = Джон, возраст = 42)»;

Другими словами: когда этот класс пользователя является классом данных,и когда у вас есть два пользовательских объекта, объявленных с User(name=John, age=42), тогда эти два объекта будут равны, потому что метод генерируется equals() будет сравнивать имя и возраст в пределах этого класса данныхobjects.

Класс Open , с другой стороны, является обычным классом, который open для расширения.Значение: по умолчанию, когда вы пишете класс на Kotlin, он может быть не расширенным.Да, наследование запрещено по умолчанию.Объявляя класс открытым, вы говорите компилятору: «Я намерен расширить этот класс».Другими словами: если вы хотите иметь Child extends Base, тогда ваш Base класс должен быть объявлен open в Kotlin.

Вкратце: data классыподразумевается как контейнеры для значений , которые можно использовать как таковые. Open - это другое понятие, оно просто сводится к: может быть унаследовано (соответственно переопределено, когда речь идет о методах) некоторым дочерним классом.to, вам говорят:

  • вы не можете использовать Realm для обработки данных классов
  • , а приведенный там пример просто предполагает что, возможно, вы захотите расширить этот класс Person, поэтому он объявлен `open``

Я предполагаю: если вы не собираетесь создавать подклассы своих классов, вы просто идете без открытое ключевое слово!Напишите стандартные kotlin и сделайте их открытыми, если они предназначены для расширения.

...