Kotlinのキーワード(1)

12047 ワード

object単例モードの作成に使用
例:
object Resource {
    val name = "Name"
}

Lazy怠け者属性(遅延ロード)
例:
val p: String by lazy {
    //   string  
}

when javaに相当するswitch()文を判断するために使用されます
例:
when(color) {
        "Red" -> 0
        "Green" -> 1
        "Blue" -> 2
        else -> throw IllegalArgumentException("Invalid color param value")
    }

try{...}catch(){...}異常捕捉用
≪インスタンス|Instance|emdw≫
fun test() {
    val result = try {
        count()
    }catch (e: ArithmeticException) {
        throw IllegaStateException(e)
    }
    //   result
}

letは現在のオブジェクトを閉パッケージのitパラメータとしてデフォルトで、戻り値は関数の最後の行、またはreturnを指定します.
例:
fun testLet(): Int {
    // fun  T.let(f: (T) -> R): R { f(this)}
    "testLet".let {
        println(it)
        println(it)
        println(it)
        return 1
    }
}
//    
//testLet
//testLet
//testLet

applyはあるオブジェクトのapply関数を呼び出し、関数の範囲内で、そのオブジェクトの任意の方法を任意に呼び出し、そのオブジェクトを返すことができる.
例:
fun testApply() {
    // fun  T.apply(f: T.() -> Unit): T { f(); return this }
    ArrayList<String>().apply {
        add("testApply")
        add("testApply")
        add("testApply")
        println("this = " + this)
    }.let { println(it) }
}

//     
// this = [testApply, testApply, testApply]
// [testApply, testApply, testApply]

with関数は単独の関数で、Kotlinのextensionではないので、呼び出し方が少し違っていて、最後の行を返して、オブジェクトを直接呼び出す方法があり、letとapplyの結合のように感じられます.
例:
fun testWith() {
    // fun  with(receiver: T, f: T.() -> R): R = receiver.f()
    with(ArrayList()) {
        add("testWith")
        add("testWith")
        add("testWith")
        println("this = " + this)
    }.let { println(it) }
}
//     
// this = [testWith, testWith, testWith]
// kotlin.Unit

関数名
定義#テイギ#
パラメータ
戻り値
extension
let
fun T.let(f: (T) -> R): R = f(this)
it
クローズバック
はい
apply
fun T.apply(f: T.() -> Unit): T { f(); return this }
いいえ、thisを使用できます.
this
はい
with
fun with(receiver: T, f: T.() -> R): R = receiver.f()
いいえ、thisを使用できます.
クローズバック
いいえ
run
fun T.run(f: T.() -> R): R = f()
いいえ、thisを使用できます.
クローズバック
はい
コンストラクタは構造関数を識別するために使用されます
class Customer(name: String){
    init {
        logger,info("Customer initialized with value ${name}")
    }
}
  • 二次構造関数
  • class Person { 
        constructor(parent: Person) {
            parent.children.add(this) 
        }
    }

    Open open注記はjavaのfinalとは逆です.他のクラスがこのクラスを継承できるようにします.デフォルトでは、kotlinのすべてのクラスはfinalであり、統合可能であることを示します.
  • 修飾クラス:インスタンスを継承できることを示す:
  • open class Base(p: Int)
    
    class Derived(p: Int) : Base(p)
  • 修飾メンバー:kotlinで明確なことを堅持する.Javaとは異なり、kotlinは複写可能なメンバーを明確に注釈し、
  • を書き換える必要があります.
    open class Base {
        open fun v() {}
        fun nv() {}
    }
    
    class Derived() : Base() {
        override fun v() {}
    }

    abstract抽象クラスクラスクラスのクラスまたは一部のメンバーがabstractとして宣言される可能性があります.抽象的なメソッドはクラスに実装されていません.抽象クラスや関数にopen注釈を追加する必要はありません.デフォルトではありません.
    open class Base {
        open fun f() {}
    }
    
    abstract class Derived : Base() {
        override abstract fun f()
    }

    companion objectに伴うオブジェクト
    kotlinではjavaやC#のように静的な方法はありません.ほとんどの場合、パッケージレベルの関数のみを使用することをお勧めします.インスタンスクラスがなければ呼び出せるメソッドを書きますが、クラスの内部(たとえばファクトリメソッド)にアクセスする必要がある場合は、そのクラスのメンバー(you can write it as a member of an obdeclaration inside that class)と書くことができます.より効率的な方法は、クラスに伴うオブジェクトを宣言することです.これによりjava/c#のように静的メソッドとして呼び出すことができ、クラス名を識別するだけでいいです.
    ≪インスタンス|Instance|ldap≫:グローバル・アプリケーション・インスタンスの取得
    companion object {
            lateinit var instance: App
        }

    sealedシールクラス
    密封クラスは厳格なクラス構造を表すために使用され、値は有限集合の中のいずれかのタイプであり、他のタイプであってはならない.これは、列挙クラスの拡張に相当します.列挙値セットのタイプは厳密に制限されていますが、各列挙定数は1つのインスタンスしかありません.シールクラスのサブクラスには、異なる状態を含む複数のインスタンスがあります.シールクラスを宣言するにはclassの前にsealed修飾子を追加する必要があります.シール類は、サブクラスを有するもよいが、すべてシール類宣言の内部にネストする必要がある.
    sealed class Expr {
        class Const(val number: Double) : Expr() 
        class Sum(val e1: Expr, val e2: Expr) : Expr() 
        object NotANumber : Expr()
    }

    注意シールクラスサブクラスの拡張は、シールクラス宣言の内部で行う必要がなく、どこでも可能である.シールクラスを使用する最も主要なメリットは、when式を使用することです.宣言がすべてのシナリオに上書きされ、elseシナリオを使用する必要がないことを確認できます.
    fun eval(expr: Expr): Double = when(expr) { 
        is Const -> expr.number
        is Sum -> eval(expr.e1) + eval(expr.e2) 
        NotANumber -> Double.NaN
        // the `else` clause is not required because we've covered all the cases
    }

    lateinit遅延初期化プロパティ
    通常、空でないタイプの属性を持つように定義するには、コンストラクタで初期化する必要がある.しかし、時にはそれほど便利ではありません.例えばセルテストでは、属性は注入に依存する初期化するか、setup法により初期化すべきである.この条件では、コンストラクタに空でない初期化文を指定することはできませんが、このプロパティにアクセスするときに空でないチェックを避けたいと考えています.このような状況を処理するために、この属性にlateinit修飾子を付けることができます.
    public class MyTest {
        lateinit var subject: TestSubject
    
        @SetUp fun setup() {
            subject = TestSubject()
        }
    
        @Test fun test() {
            subject.method() 
        }
    }

    この修飾子はクラスのvarタイプの可変属性定義にのみ用いることができ、構造方法には用いることができない.また、属性にはカスタムgetterとsetterアクセサがある.この属性のタイプは空でない必要があり、同様に基本的なタイプではない.遅延初期化のプロパティが初期化される前にアクセスすると、アクセス時に値が初期化されていないことを示す特定の例外が発生します.