Kotlin — преобразовать объект в разделяемый

#android #kotlin

#Android #kotlin

Вопрос:

Привет, у меня есть обычный класс данных

 data class Message(
    val code: Int,
    val message: String?
)
  

и его версия @Parcelize

 @Parcelize
data class MessagePresentation(
    val code: Int,
    val message: String?
): Parcelable
  

Теперь, как написать конвертер, чтобы я мог сопоставить класс 1 с 1?

Комментарии:

1. Учитывая, что 2 класса идентичны, вам вообще нужны оба?

Ответ №1:

Вы можете добиться этого несколькими способами:

  1. с помощью функций расширения —
 private fun Message.toMessagePresentation(): MessagePresentation {
    return MessagePresentation(code, message)`
}
  
  1. с помощью метода экземпляра —
 data class Message(
   val code: Int,
   val message: String?
) {
   fun toMessagePresentation(): MessagePresentation {
       return MessagePresentation(code, message)
  }
}
  
  1. через конструктор —
 @Parcelize
data class MessagePresentation(
   val code: Int,
   val message: String?
) : Parcelable {
    constructor(message: Message) : this(message.code, message.message)
}
  

Вывод —

 val message = Message(0, "hello")
val messageRepresentation1 = message.toMessagePresentation()
val messageRepresentation2 = message.toMessagePresentation()
val messageRepresentation3 = MessagePresentation(message)
  

Ответ №2:

Вам не нужно создавать какую-то специальную логику для преобразования. Единственное, что вам нужно сделать, это создать свой MessagePresentation объект с полями вашего Message объекта.

 ...
val message = Message(code, message)
val messagePresentation = MessagePresentation(message.code, message.message)
...
  

Например, вы можете указать дополнительный конструктор в MessagePresentation классе с Message аргументом.

Также вы можете создать функцию расширения, подобную этой

 fun Message.toPresentation(): MessagePresentation =
    MessagePresentation(
        code = code
        message = message
    )