Metody pobierające i ustawiające są generowane automatycznie w Kotlinie. Jeśli napiszesz:
val isEmpty: Boolean
Odpowiada następującemu kodowi Java:
private final Boolean isEmpty;
public Boolean isEmpty() {
return isEmpty;
}
W twoim przypadku modyfikator dostępu prywatnego jest zbędny - isEmpty jest domyślnie prywatny i może być dostępny tylko przez getter. Kiedy próbujesz uzyskać właściwość isEmpty obiektu, wywołujesz metodę get w rzeczywistości. Aby lepiej zrozumieć metody pobierające / ustawiające w Kotlinie: dwie poniższe próbki kodu są równe:
var someProperty: String = "defaultValue"
i
var someProperty: String = "defaultValue"
get() = field
set(value) { field = value }
Chcę również zwrócić uwagę, że this
getter nie jest twoją własnością - jest to instancja klasy. Jeśli chcesz uzyskać dostęp do wartości pola w getterze lub setterze, możesz użyć do tego zarezerwowanego słowa field
:
val isEmpty: Boolean
get() = field
Jeśli chcesz mieć tylko metodę get w dostępie publicznym - możesz napisać ten kod:
var isEmpty: Boolean
private set
ze względu na prywatny modyfikator w pobliżu metody dostępu set możesz ustawić tę wartość tylko w metodach wewnątrz obiektu.
In your case the private access modifier is redundant
W jaki sposób? Doc Kotlin mówi, że domyślny modyfikator jest publiczny. kotlinlang.org/docs/reference/visibility-modifiers.htmlval isEmpty: Boolean
Nie zostanie skompilowany jako isEmpty nie jest jeszcze zainicjowany, prawda? Dopiero zaczynam uczyć się Kotlina. Co się dzieje zget() = field
?val
's have no setterZasady dotyczące modyfikatorów widoczności metod dostępu do właściwości są następujące:
Widoczność
var
ival
właściwość pobierająca powinny być dokładnie takie same, jak widoczność właściwości, więc możesz tylko jawnie powielić modyfikator właściwości, ale jest to zbędne:protected val x: Int protected get() = 0 // No need in `protected` here.
Widoczność
var
właściwości ustawiająca powinna być taka sama lub mniej dopuszczalna niż widoczność właściwości:protected var x: Int get() = 0 private set(x: Int) { } // Only `private` and `protected` are allowed.
W Kotlinie dostęp do właściwości jest zawsze uzyskiwany za pośrednictwem metody pobierającej i ustawiającej, dlatego nie ma potrzeby tworzenia właściwości
private
zpublic
akcesoriami, takimi jak w Javie - jej pole zapasowe (jeśli jest obecne) jest już prywatne. Tak więc modyfikatory widoczności w akcesoriach właściwości są używane tylko po to, aby widoczność ustawiacza była mniej dopuszczalna:W przypadku właściwości z polem zapasowym i domyślnymi metodami dostępu:
var x = 0 // `public` by default private set
W przypadku właściwości bez pola zapasowego:
var x: Int // `public` by default get() = 0 protected set(value: Int) { }
źródło
x
równe some"Some String"
i zwrócenie, powiedzmy, długości11
ciągu?private
ze zmiennej i stał się dostępny z innej klasy za pomocą metody getter.1) Przykład domyślny
setter
igetter
dla nieruchomościfirstName
w Kotlinieclass Person { var firstName: String = "" get() = field // field here ~ `this.firstName` in Java or normally `_firstName` is C# set(value) { field = value } }
Za pomocą
val p = Person() p.firstName = "A" // access setter println(p.firstName) // access getter (output:A)
JEŚLI twój
setter
lubgetter
jest dokładnie taki sam powyżej, możesz go usunąć, ponieważ jest niepotrzebny2) Przykład ustawiający i pobierający niestandardowy.
const val PREFIX = "[ABC]" class Person { // set: if value set to first name have length < 1 => throw error else add prefix "ABC" to the name // get: if name is not empty -> trim for remove whitespace and add '.' else return default name var lastName: String = "" get() { if (!field.isEmpty()) { return field.trim() + "." } return field } set(value) { if (value.length > 1) { field = PREFIX + value } else { throw IllegalArgumentException("Last name too short") } } }
Za pomocą
val p = Person() p.lastName = "DE " // input with many white space println(p.lastName) // output:[ABC]DE. p.lastName = "D" // IllegalArgumentException since name length < 1
Więcej
Zaczynam uczyć się Kotlina od Javy, więc jestem zagubiony
field
iproperty
ponieważ w Javie nie maproperty
.Po jakimś wyszukiwaniu widzę
field
iwproperty
Kotlinie wyglądam jak C # ( Jaka jest różnica między polem a właściwością? )Oto niektóre istotne stanowisko, które mówią o
field
iproperty
w Java i Kotlin.czy java ma coś podobnego do właściwości C #?
https://blog.kotlin-academy.com/kotlin-programmer-dictionary-field-vs-property-30ab7ef70531
Popraw mnie, jeśli się mylę. Mam nadzieję, że to pomoże
źródło
Metoda pobierania w kotlin jest domyślnie publiczna, ale można ustawić metodę ustawiającą na prywatną i ustawić wartość za pomocą jednej metody wewnątrz klasy. Lubię to.
/** * Created by leo on 17/06/17.*/ package foo class Person() { var name: String = "defaultValue" private set fun foo(bar: String) { name = bar // name can be set here } } fun main(args: Array<String>) { var p = Person() println("Name of the person is ${p.name}") p.foo("Jhon Doe") println("Name of the person is ${p.name}") }
źródło
Możesz zobaczyć ten samouczek, aby uzyskać więcej informacji:
Jeszcze jeden samouczek Kotlin dla programistów Androida
źródło
Oto praktyczny, rzeczywisty przykład metody pobierającej i ustawiającej Kotlin (zobacz więcej szczegółów tutaj ):
// Custom Getter val friendlyDescription get(): String { val isNeighborhood = district != null var description = if (isNeighborhood) "Neighborhood" else "City" description += " in" if (isNeighborhood) { description += " $city," } province?.let { if (it.isNotEmpty()) { description += " $it," } } description += " $country" return description } print(myLocation.friendlyDescription) // "Neighborhood in Denver, Colorado, United States" // Custom Setter enum class SearchResultType { HISTORY, SAVED, BASIC } private lateinit var resultTypeString: String var resultType: SearchResultType get() { return enumValueOf(resultTypeString) } set(value) { resultTypeString = value.toString() } result.resultType = SearchResultType.HISTORY print(result.resultTypeString) // "HISTORY"
źródło