web-dev-qa-db-ja.com

コトリンのゲッターとセッター

たとえば、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.

では、ゲッターはどのように機能しますか?

57
alexey polusov

ゲッターとセッターは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修飾子があるため、この値はオブジェクト内のメソッドでのみ設定できます。

97
Cortwave

プロパティアクセサに関するルール 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) { }
    
25
hotkey

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}")
}
6
Lalit Behera

詳細については、このチュートリアルをご覧ください。

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キーワードでマークします。

4
Pluto65

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のfieldpropertyがC#のように見える( フィールドとプロパティの違いは何ですか?

JavaおよびKotlinのfieldおよびpropertyについて説明している関連記事を次に示します。
JavaにはC#プロパティに似たものがありますか?
https://blog.kotlin-academy.com/kotlin-programmer-dictionary-field-vs-property-30ab7ef70531

間違っている場合は修正してください。お役に立てば幸いです

4
Phan Van Linh