Котлин. Класс данных: как обновить один из параметров?

У меня есть класс данных. Например:

        data class Test(
        val data: String,
        val data2: String
    )

Предположим, мне нужно изменить один из параметров моего класса данных. Для этого я напишу следующий код:

        var test = Test(data = "data", data2 = "data2")
  test = test.copy(data = "new_data")

Но при этом я могу сделать параметрvarи измените его напрямую:

        data class Test(
            var data: String,
            val data2: String
        )


 var test = Test(data = "data", data2 = "data2")
 test.data = "new_data"

Какой метод лучше использовать? Предположим, что мой класс данных может иметь большое количество параметров, не возникнет ли в этом случае проблем при использованииcopy().

Пожалуйста, помогите мне.

2 ответа

Зависит от того, как вы используете класс.

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

Если они отображают текущее состояние (чаще в играх и симуляциях),varможет быть применимо, и в этом случае вы обнаружите, что вам редко нужна эта функция. Если вы используетеcopy()в этом случае вы получаете новую копию, не затрагивая оригинал.

Это зависит от варианта использования. Я не думаю, что есть глобально предпочтительный способ.

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

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

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

Другие вопросы по тегам