Как сделать класс данных синглтоном в Kotlin? - PullRequest
1 голос
/ 23 мая 2019

Предположим, у меня есть класс данных:

data class SensorData(val name: String, val temp : Double)

Я создаю этот объект SensorData либо из службы REST, либо с помощью внутреннего метода установки, тогда как name всегда заполняется и temp может бытьempty.

Далее, мне нужен этот объект SensorData через несколько классов, вот я и подумал об использовании singleton.

Очевидно, мне нужно ключевое слово object , как описано здесь , но как мне объединить data class object?

Ответы [ 3 ]

1 голос
/ 23 мая 2019

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

data class SensorData(val name: String, var temp : Double) {
    companion object {
        @Volatile
        @JvmStatic
        private var INSTANCE: SensorData? = null

        @JvmStatic
        @JvmOverloads
        fun getInstance(name: String = "default", temp : Double = 0.0): SensorData = INSTANCE ?: synchronized(this) {
            INSTANCE ?: SensorData(name, temp).also { INSTANCE = it }
        }
    }
}

И использовать его так:

val name1 = SensorData.getInstance("name", 5.0).name

// Or with default values:
val name2 = SensorData.getInstance().name
1 голос
/ 23 мая 2019

Я думаю, вы неправильно поняли синглтон:

"Шаблон singleton - это шаблон разработки программного обеспечения, который ограничивает создание экземпляра класса одним" единственным "экземпляром"

Он предназначен не только для того, чтобы сделать его общедоступным для всех классов, но и для ограничения количества экземпляров.

Класс данных - это класс для хранения данных, почему он должен быть Singleton?

Переосмыслите свою архитектуру, чтобы сделать ее доступной там, где она вам нужна.

0 голосов
/ 23 мая 2019

Не используйте класс данных в качестве одиночного. Это не то, для чего они предназначены. Лучшим подходом было бы создать объект-оболочку вокруг вашего класса данных, который обрабатывает ваши SensorData-Object (s). Это также позволит вам использовать несколько объектов SensorData (возможно, потребуется в будущем) или заменить текущий на новый, если вы повторно опросите REST-Service.

object SensorDataService {
 var sensorData: SensorData? = null
}

data class SensorData(val name: String, val temp : Double)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...