たとえば、Javaでは、IDEで生成されたゲッターを自分で作成したり、ロンボクで@Getterなどの注釈を使用したりできます。
ただし、Kotlinには デフォルトではゲッターとセッター があります。しかし、私はそれらを使用する方法を理解することはできません。
私はそれを作りたいと言います-Javaに似ています:
private val isEmpty: String
get() = this.toString() //making this thing public rises an error: Getter visibility must be the same as property visibility.
では、ゲッターはどのように機能しますか?
ゲッターとセッターはKotlinで自動生成されます。あなたが書く場合:
val isEmpty: Boolean
次のJavaコードと同じです。
private final Boolean isEmpty;
public Boolean isEmpty() {
return isEmpty;
}
あなたの場合、プライベートアクセス修飾子は冗長です-isEmptyはデフォルトでプライベートであり、ゲッターのみがアクセスできます。オブジェクトのisEmptyプロパティを取得しようとすると、実際にgetメソッドを呼び出します。 Kotlinのゲッター/セッターの詳細については、以下の2つのコードサンプルは同じです。
var someProperty: String = "defaultValue"
そして
var someProperty: String = "defaultValue"
get() = field
set(value) { field = value }
また、ゲッターのthis
はあなたのプロパティではなく、クラスインスタンスであることに注意してください。ゲッターまたはセッターでフィールドの値にアクセスする場合は、予約語field
を使用できます。
val isEmpty: Boolean
get() = field
パブリックアクセスでgetメソッドのみが必要な場合は、次のコードを記述できます。
var isEmpty: Boolean
private set
setアクセサーの近くにprivate修飾子があるため、この値はオブジェクト内のメソッドでのみ設定できます。
プロパティアクセサに関するルール visibility modifiers は次のとおりです。
var
およびval
プロパティのゲッター可視性は、プロパティの可視性とまったく同じと同じである必要があるため、明示的にのみプロパティ修飾子を複製しますが、冗長です。
protected val x: Int
protected get() = 0 // No need in `protected` here.
var
プロパティのより良い可視性は、プロパティの可視性と同じか同じかそれより許容度が低いである必要があります。
protected var x: Int
get() = 0
private set(x: Int) { } // Only `private` and `protected` are allowed.
Kotlinでは、プロパティは常にゲッターとセッターを介してアクセスされるため、Javaのようにprivate
アクセサーを使用してプロパティpublic
を作成する必要はありません- そのバッキングフィールド(存在する場合) はすでにプライベートです。そのため、プロパティアクセサーの可視性修飾子は、セッターの可視性を緩和するためにのみ使用されます。
バッキングフィールドとデフォルトアクセサを持つプロパティの場合:
var x = 0 // `public` by default
private set
バッキングフィールドのないプロパティの場合:
var x: Int // `public` by default
get() = 0
protected set(value: Int) { }
KotlinのGetterはデフォルトではpublicですが、セッターをprivateに設定し、クラス内の1つのメソッドを使用して値を設定できます。このような。
/**
* 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}")
}
詳細については、このチュートリアルをご覧ください。
Android開発者向けのもう1つのKotlinチュートリアル
物性
Kotlinの世界では、クラスはフィールドを持つことはできず、プロパティだけを持つことができます。 varキーワードは、valとは対照的に、プロパティが可変であることを示しています。例を見てみましょう:
class Contact(var number: String) { var firstName: String? = null var lastName: String? = null private val hasPrefix : Boolean get() = number.startsWith("+") }
多くのコードはありませんが、多くのことが舞台裏で行われています。 手順を追って説明します。まず、パブリック最終クラスContactを作成しました。
これは、私たちが直面しなければならない主要なルールです。特に指定しない限り、クラスはデフォルトでpublicおよびfinalです(ちなみに、クラスメソッドの場合も同じです)。クラスから継承する場合は、openキーワードでマークします。
1)Kotlinのpropertysetter
のデフォルトのgetter
およびfirstName
の例
class Person {
var firstName: String = ""
get() = field // field here ~ `this.firstName` in Java or normally `_firstName` is C#
set(value) {
field = value
}
}
を使用して
val p = Person()
p.firstName = "A" // access setter
println(p.firstName) // access getter (output:A)
のsetter
またはgetter
がとまったく同じ場合不要なので削除します
2)カスタムのセッターとゲッターの例。
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")
}
}
}
を使用して
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
その他
JavaからKotlinの学習を開始します。Javaにはfield
がないため、property
およびproperty
について混乱しています。
検索後、Kotlinのfield
とproperty
がC#のように見える( フィールドとプロパティの違いは何ですか? )
JavaおよびKotlinのfield
およびproperty
について説明している関連記事を次に示します。
JavaにはC#プロパティに似たものがありますか?
https://blog.kotlin-academy.com/kotlin-programmer-dictionary-field-vs-property-30ab7ef70531
間違っている場合は修正してください。お役に立てば幸いです