Как установить свойство созданного объекта в kotlin?

#oop #kotlin #properties

#ооп #kotlin #свойства

Вопрос:

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

 //create this object
class random(val name : String?){

}

var obj = random("bob")
obj.newattribute :Int = 2 //cant do this in this lang
  

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

1. Мне было бы интересно узнать, каков ваш вариант использования для этого. Чего вы пытаетесь достичь?

2. К счастью, вы не можете. Kotlin — это строго типизированный язык.

3. @Joffrey Я создаю скелет библиотеки firebase для системы социальных сетей. используя базу данных, которую вы можете передать в класс данных, firebase примет все свойства класса данных и создаст пару ключ-значение внутри указанного ссылочного местоположения базы данных. Итак, моя библиотека взяла бы объект класса данных и добавила к нему атрибут, а затем отправила его в указанную ссылку на базу данных firebase. Но я думаю, я могу вручную просто извлечь свойства из переданного в объект класса данных, а затем создать свой собственный объект с моим новым атрибутом.

Ответ №1:

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

Если вы прочитаете документацию классов Kotlin, вы наткнетесь на следующий абзац (первый в связанной документации):

Объектная модель Kotlin существенно отличается от Python. Самое главное, что классы не могут динамически изменяться во время выполнения! (Есть некоторые ограниченные исключения из этого, но вы, как правило, не должны этого делать. Однако можно динамически проверять классы и объекты во время выполнения с помощью функции, называемой отражением — это может быть полезно, но должно использоваться разумно.) Все свойства (атрибуты) и функции, которые могут когда-либо понадобиться в классе, должны быть объявлены либо непосредственно в теле класса, либо как функции расширения, поэтому вам следует тщательно продумать дизайн вашего класса.

Это просто означает, что в Kotlin это невозможно, и в нем говорится, что вы даже не должны интенсивно использовать проверки во время выполнения, которые возможны.

Ответ №2:

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

При этом, если вам нужно хранилище ключ-значение, куда вы можете помещать пары ключ-значение и получать доступ к значениям по их ключу, вам следует использовать реализацию MutableMap интерфейса.

Например, HashMap является ли реализация этого интерфейса:

 val myMap = HashMap<String, Int>()
myMap["newattribute"] = 2

println(myMap["newAttribute"]) // prints "2"
  

Обратите внимание, что тип ключей и значений четко определен. Данный Map может иметь дело только с ключами того же типа (здесь String s ) и значениями того же типа (здесь Int s ). Это означает, что вы не можете myMap["stringProperty"] = "text" использовать карту, определенную в приведенном выше примере.

Если вы действительно хотите что-то более общее (особенно для значений), вам нужно будет использовать более широкий тип в качестве типа «значения» на карте. Например, используйте MutableMap<String, Any> вместо, чтобы значения могли иметь любой ненулевой тип:

 val myMap = HashMap<String, Any>()
myMap["intAttr"] = 42
myMap["strAttr"] = "text"

println(myMap["intAttr"]) // prints "42"
println(myMap["strAttr"]) // prints "text"