Kotlin сеттер, нарушающий инкапсуляцию - PullRequest
0 голосов
/ 28 октября 2019

Я очень волновался по поводу такого рода реализации

var stringRepresentation: String
    get() = this.toString()
    set(value) {
        setDataFromString(value) // parses the string and assigns values to other properties
    }

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

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

Опасен ли такой тип реализации и не нарушает ли он правила инкапсуляции?

Спасибо

1 Ответ

1 голос
/ 28 октября 2019

Реализация для варианта использования кажется необычной и опасной, потому что при вызове сеттера для поля я бы никогда не ожидал поведение:

присваивает значения другие свойства


Я бы порекомендовал создать отдельные функции.

1) Ваше поле в любом случае является функцией:

fun stringRepresentation() = this.toString()

2) Установка других свойств:

parseAndSetOther(value: String)  { 
  /* parses the string and assigns values to other properties */ 
}

2.1) Возможно, вы можете оставить объект неизменным и вернуть новый измененный объект:

parseAndSetOther(value: String) : MyClass { 
  /* parses the string and assigns values to other properties */ 
  return this.copy(value = "new value", ...)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...