Впервые на kotlin ...
В документации kotlin для объявления и доступа к свойствам говорится, что вы можете получить доступ к свойствам объекта класса с помощью точечной нотации и синтаксиса "=", который вызывает методы получения и установки:
To use a property, we simply refer to it by name, as if it were a field in Java:
fun copyAddress(address: Address): Address {
val result = Address() // there's no 'new' keyword in Kotlin
result.name = address.name // accessors are called
result.street = address.street
// ...
return result
}
Кажется, что это работает с обычными классами, но если вы объявляете класс открытым и пытаетесь получить доступ к свойствам класса из другого пакета, это, похоже, выходит за пределы окна, и вы вынуждены явно использовать методы получения и установки. Это правильно, и если да, то почему?
package app.foo
open class FooClass {
var fooProp = "test";
fun doSomething() {
// Just to show what's going on
val tmpFoo = FooClass()
tmpFoo.fooProp // No error here
tmpFoo.fooProp = "New Value" // No error here
}
}
// Different Class, same package
package app.foo
import app.foo.FooClass
class Foo2Class {
fun doSomething() {
// Just to show what's going on
val tmpFoo = FooClass()
tmpFoo.fooProp // No error here
tmpFoo.fooProp = "New Value" // No error here
}
}
// Different Class, different package
package app.bar
import app.foo.FooClass
class BarClass {
fun doSomething() {
// Just to show what's going on
val tmpFoo = FooClass()
tmpFoo.fooProp // Error here
tmpFoo.fooProp = "New Value" // Error here
tmpFoo.getFooProp() // No error here
tmpFoo.setFooProp("New Value") // No error here
}
}
Ошибка, которую я на самом деле вижу при попытке использовать «tmpFoo.fooProp» вне пакета app.foo, заключается в том, что «fooProp имеет частный доступ в app.foo.FooClass», что не имеет смысла, если вызов (по умолчанию) публичного геттера.
Я ожидаю, что у меня будет возможность использовать tmpFoo.fooProp для доступа к получателю и tmpFoo.fooProp = "value" для установки значения через установщик, независимо от того, в каком пакете я нахожусь.
Если я удалю ключевое слово open в FooClass, все будет работать как положено.