kotlinノート:Objectキーワード


Objectキーワード


kotlinのobjectキーワードは、シーンを使用するオブジェクトを作成するために使用されます.
  • オブジェクト宣言
  • 伴生対象
  • オブジェクト式
  • オブジェクト宣言


    オブジェクト宣言は、単一のインスタンスを作成するために使用されます.
    クラスと同様に、オブジェクトの宣言には、属性、メソッド、初期化文ブロックなどの宣言も含まれます.唯一の違いは、オブジェクトに構築方法(プライマリとセカンダリ)がないことです.オブジェクト宣言は定義時にすぐに作成されるので、関数を構築する必要はありません.
    クラス外部でもクラス内部でも単一のオブジェクトを生成できますが、funでは単一のオブジェクトを生成できません.
    例:
    fun main(args: Array<String>) {
        SuperMan.power()
        TheFlash.power()
        BatMan.power()
        compareSpeed(SuperMan, TheFlash, BatMan)
    }
    
    abstract class SuperHero(open var energy: Int = 100, open var speed: Int = 100) {
        abstract fun power()
    }
    
    object SuperMan : SuperHero() {
        override var speed = 1000
        override fun power() {
            lasing()
        }
    
        private fun lasing() {
            println(">------------------")
        }
    }
    
    object TheFlash : SuperHero() {
        override var speed = 1500
        override fun power() {
            runOnLake()
        }
    
        private fun runOnLake() {
            println("~~~~~~~~/\\~~~~~~~~~")
        }
    }
    
    object BatMan : SuperHero() {
        override var speed = 10
        override fun power() {
            justRich()
        }
    
        private fun justRich() {
            println("$$$$$$$$$$$$$$$$$$$")
        }
    }
    
    object SpeedComparator : Comparator<SuperHero> {
        override fun compare(s1: SuperHero, s2: SuperHero): Int {
            return s1.speed.compareTo(s2.speed)
        }
    }
    
    fun compareSpeed(vararg heros: SuperHero) {
        var list = mutableListOf<SuperHero>()
        list.addAll(heros)
        println(list.sortedWith(SpeedComparator))
    }
    

    出力:
    >------------------
    ~~~~~~~~/\~~~~~~~~~
    $$$$$$$$$$$$$$$$$$$
    [BatMan, SuperMan, TheFlash]
    

    伴生対象


    クラスでcompanion objectキーワードを使用して修飾されたオブジェクト.
    kotlinにはstaticキーワードはありません.代わりに、kotlinにはパッケージレベル関数、オブジェクト宣言、および伴生オブジェクトがあります.
    JAvaクラスではprivateが本クラスでアクセスできるため、クラスのstaticメソッドはクラスのプライベートメソッドとクラスオブジェクトのプライベート変数にアクセスできます.
  • パケットレベル関数はjavaの静的メソッドに相当し、クラスの公開メソッドとクラスオブジェクトの公開変数にアクセスできます.
  • はjavaの静的変数に相当するオブジェクトを伴う.この変数は静的内部クラスのオブジェクトであり、その内部の変数は静的変数とすることができ、その内部の方法は静的方法とすることができる.クラスのプライベートメソッドとクラスオブジェクトのプライベート変数にアクセスできます.このような特性は工場法(構造関数はプライベート)に用いることができる.
  • オブジェクト宣言は、単一の例に相当します.

  • パケットレベル関数は、javaの静的メソッド、静的変数を伴生オブジェクトとともに構成します.オブジェクト宣言は、特殊な「クラスと伴生オブジェクトが1つになる」オブジェクトです.
    例:
    fun main(args: Array<String>) {
        var bigHouse = House.newBigHouse()
        var smallHouse = House.newSmallHouse()
    }
    
    class House private constructor(var width: Int = 100, var height: Int = 6) {
    	 //  , 
        companion object {
            fun newBigHouse() = House(100, 100)
            fun newSmallHouse() = House(20, 20)
        }
    }
    

    通常のオブジェクトの伴生オブジェクトとして


    伴生オブジェクトは、クラス内の静的内部クラスのオブジェクトに相当し、名前、インタフェースを実装でき、拡張関数を持つこともできます.
    インスタンス(拡張関数):
    fun main(args: Array<String>) {
        var bigHouse = House.newBigHouse()
        var smallHouse = House.newSmallHouse()
    
        bigHouse.computeArea()
        smallHouse.computeArea()
    
        House.computeArea()
    }
    
    class House private constructor(var length: Int, var width: Int) {
    
        companion object {
            fun newBigHouse() = House(100, 100)
            fun newSmallHouse() = House(20, 20)
        }
    }
    
    //  , 
    fun House.computeArea() {
        println(this.length * this.width)
    }
    
    //  , 
    fun House.Companion.computeArea() {
        println("I can not access private member and method")
    }
    

    出力:
    10000
    400
    I can not access private member and method
    

    オブジェクト式


    これはkotlinの匿名の内部クラスで、javaとは異なり、複数のインタフェースを実装したり、インタフェースを実装したりすることができます.また、final以外の変数にもアクセスできます.
    例:
    fun main(args: Array<String>) {
        var button = Button()
        var buttonClickCount = 0
        // object  
        button.clickListener = object : ClickListener, LongClickListener {
            override fun onClick() {
                // onClick   var  (  final  )
                buttonClickCount++
                println("you click me $buttonClickCount Time!")
            }
    
            override fun onLongClick() {
                println("you long click me!")
            }
        }
        for (i in 1..4) {
            button.beenClick()
        }
    }
    
    class Button {
        var clickListener: ClickListener? = null
        fun beenClick() {
            clickListener?.onClick()
        }
    }
    
    interface ClickListener {
        fun onClick()
    }
    
    interface LongClickListener {
        fun onLongClick()
    }
    

    出力:
    you click me 1 Time!
    you click me 2 Time!
    you click me 3 Time!
    you click me 4 Time!