Как избежать государственной собственности? - PullRequest
0 голосов
/ 10 ноября 2019

Вот мой код Kotlin:

class Test1 {
    var name: String? = null
    var isMarried: Boolean = false
}

и используйте его так:

   val test1 = Test1()
   test1.name = "Name1"
   test1.isMarried = true
   System.out.println("name = " + test1.name + ", isMarried = " + test1.isMarried)

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

Итак, чтобы исправить это, я использую следующий подход:

class Test2 {
    private var name: String? = null
    private var isMarried: Boolean = false

    fun getName(): String? {
        return name
    }

    fun setName(name: String) {
        this.name = name
    }

    fun isMarried(): Boolean {
        return isMarried
    }

    fun setMarried(isMarried: Boolean) {
        this.isMarried = isMarried
    }
}

и использую его так:

 val test2 = Test2()
 test2.setName("Name2")
 test2.setMarried(false)
 System.out.println("name = " + test2.getName() + ", isMarried = " + test2.isMarried())

Как видите, я был создан мои пользовательские методы получения / установки . Также свойства name и isMarried являются частными . В результате приложение не имеет прямого доступа к этим свойствам. Приложение имеет доступ к этим свойствам только через методы получения / установки .

Это правильное решение?

1 Ответ

7 голосов
/ 10 ноября 2019

Хотя это не является технически неправильным, это просто ненужная работа. Важно понимать разницу между полями Java и свойствами Kotlin. В то время как Java позволяет вам читать и писать непосредственно из поля, Kotlin всегда скрывает поля за методами доступа, поэтому свойство - это набор методов доступа с нашим без поля поддержки, к которому внешний код не имеет доступа. Объявляя var, вы автоматически создаете геттер, сеттер и поле поддержки. Все операции чтения или записи в это свойство должны вызывать методы доступа, но синтаксис Kotlin скрывает это от вас и создает впечатление, что вы обращаетесь к полю напрямую. Подводя итог, вы не получаете никакой дополнительной инкапсуляции, представляя свои собственные методы получения и установки - компилятор Kotlin сделает это за вас по умолчанию.

Если вы работаете с Intellij IDEA или Android Studio, есть способчтобы просмотреть Java-эквивалент кода Kotlin, который вы пишете. Просто откройте меню «Все действия» с помощью Cmd + Shift + A и введите «байт-код», затем выберите «Показать байт-код Kotlin». Вы увидите панель, которая содержит байт-код для вашего Kotlin, и у вас есть опция «Декомпилировать», которая в конечном итоге покажет вам эквивалент Java. Это невероятно полезно для понимания того, что именно генерирует компилятор Kotlin.

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