Колтин несколько классов для хранения данных - PullRequest
1 голос
/ 24 апреля 2019

Я занимаюсь разработкой простого приложения для Android, в котором отображается значок транспортного средства, а пользователь может щелкнуть значок, чтобы отобразить информацию об автомобиле.Я хочу загружать данные динамически при создании приложения, то есть данные будут поступать из внешнего источника, включая изображение для значка.

Я новичок в Kotlin и не уверен, что искать, чтобы понять подходящее решение.Как правильно определить данные, лучше ли создать класс, как показано ниже, а затем создать массив этого класса (не уверен, если это возможно)

public class VehicleSpec()
{
var OEM: String? = null
var ModelName: String? = null
var EngineSize: String? = null
}

Или было бы лучше создатьмногомерный массив и затем связать данные с ячейками?

var VehicleSpec = arrayOf(20,20)
VehicleSpec[0][0] = Null //OEM
VehicleSpec[0][1] = Null //ModelName
VehicleSpec[0][2] = Null //EngineSize

Каков наилучший способ настроить хранилище данных, есть ли хорошие ссылки, чтобы понять, как это следует настроить?

Ответы [ 2 ]

1 голос
/ 24 апреля 2019

Как правильно определить данные, лучше ли создать класс, как показано ниже, а затем создать массив класса

Использование массива для свойств объектане в полной мере использует безопасность типов, которую вы имеете в Kotlin (и даже Java в этом отношении).Если вы хотите выразить несколько свойств объекта, то вам следует использовать класс для определения этих свойств.Это особенно верно, если свойства имеют разные типы.

Нет разницы в производительности между массивом и классом, потому что вы получите ссылку на кучу в обоих случаях.Вы можете сэкономить на производительности, только если вы преобразуете свой подход к многомерным массивам в одномерный массив с интеллектуальной индексацией.В большинстве случаев вам не следует рассматривать эту опцию, если вы не обрабатываете много данных и не знаете, что производительность является проблемой на этом конкретном уровне.

(не уверен, возможно ли это)

Определение списков / массивов классов определенно возможно.

Обычно для классов, которые используются только в качестве контейнеров данных, вы должны предпочесть классы данных , потому чтоони дают вам полезные методы бесплатно, и эти методы полностью имеют смысл для простых «пакетов данных», как в вашем случае (равно, хэш-код, доступ к компонентам и т. д.).

data class Vehicle(
   val OEM: String,
   val ModelName: String,
   val EngineSize: String
)

Также я предлагаю использоватьval вместо var в максимально возможной степени.Неизменность в Kotlin более идиоматична.

И последнее, но не менее важное: предпочитайте ненулевые значения нулевым, если вы знаете, что значение всегда должно присутствовать.Если есть допустимые случаи, когда значение отсутствует, вы должны использовать ноль вместо значения заполнителя, такого как пустая строка или -1.

1 голос
/ 24 апреля 2019

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

Во-вторых, я предлагаю вам два типа (и использовать классы данных ;-))

data class VehicleListEntry(
  val id: Long,
  val name: String
)

и

data class VehicleSpec(
  val id: Long,
  val oem: String = "",
  val modelName: String = "",
  val engineSize: String = ""
)

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

и теперь у вас есть Модель для хранения ваших данных

class VehicleModel() {
  private val specs: MutableMap<Long, VehicleSpec> = mutableMapOf()
  private var entries: List<VehicleListEntry> = listOf()

  fun getSpec(id: Long) = specs[id]
  fun addSpec(spec: VehicleSpec) = specs[spec.id] = spec
  fun getEntries(): List<VehicleListEntry> = entries
  fun setEntries(data: List<VehicleListEntry>)  {
    entries = data.toMutableList()
  }

}

Вы также можете использовать класс данных для вашей модели, который выглядит как

data class VehicleModel(
  val specs: MutableMap<Long, VehicleSpec> = mutableMapOf(),
  var entries: List<VehicleListEntry> = listOf()
)

И последний, но не менее важный контроллер для сбора информации

class VehicleController() {
  private val model = VehicleModel()

  init{
     // TODO get the entries list together
  }

  fun getEntries() = model.entries

  fun getSpec(id: Long) : VehicleSpec? {
     // TODO load the data from external source (or check the model first)
     // TODO store the data into the model
     // TODO return result
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...