【问题标题】:Object vs companion Object in Class类中的对象与伴随对象
【发布时间】:2019-02-06 06:24:38
【问题描述】:

FactoryFactory2 有什么不同? 他们似乎都在做同样的事情。

data class Car(val horsepowers: Int) {
companion object Factory {
    val cars = mutableListOf<Car>()

    fun makeCar(horsepowers: Int): Car {
        val car = Car(horsepowers)
        cars.add(car)
        return car
    }
}
object Factory2 {
    val cars = mutableListOf<Car>()
    fun makeCar(horsepowers: Int): Car {
        val car = Car(horsepowers)
        cars.add(car)
        return car
    }
}
}

【问题讨论】:

标签: kotlin


【解决方案1】:

伴随对象是一种特定类型的对象声明,它允许对象的行为类似于其他语言(如 Java)中的静态对象。将伴随对象添加到对象声明允许向对象添加“静态”功能,即使 Kotlin 中不存在实际的静态概念。

【讨论】:

    【解决方案2】:

    伴生对象中声明的属性和函数可以通过类名直接访问,就像我们在java中访问静态成员一样。

    所以在你的代码中,可以通过以下两种方式调用Factory的makeCar函数

    Car.makeCar(50)         // From outside the class
    Car.Factory.makeCar(50) // From outside the class
    makeCar(50)             // From inside the class
    Factory.makeCar(50)     // From insie the class
    

    另一方面,Factory2的makeCar函数只能如下调用。

    Car.Factory2.makeCar(50) // From outside the class
    Factory2.makeCar(50)     // Inside the class
    

    【讨论】:

      【解决方案3】:
      kotlin 中的

      Object 是一种实现单例的方式。

      object MyObject {
      
      // further implementation
        
        fun printHello() {
          println("Hello World!")
        }
        
      }
      

      此实现也称为对象声明。对象声明是线程安全的并且是惰性初始化的,即对象在第一次被访问时初始化

      伴随对象 如果我们希望某个实现成为一个类,但仍想将某些行为公开为静态行为,那么伴生对象就会发挥作用。这些是类中的对象声明。这些伴随对象在解析包含类时初始化,类似于 java 世界中的静态方法和变量。

      class MyClass {
      
        // some implementations
        
        companion object {
          val SOME_STATIC_VARIABLE = "STATIC_VARIABLE"
          fun someStaticFunction() {
            // static function implementation
          }
        }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-04
        • 2018-02-06
        • 2019-01-20
        • 1970-01-01
        • 2016-08-09
        • 1970-01-01
        相关资源
        最近更新 更多