Kotlin - 具有私有构造函数的类的工厂函数

时间:2017-08-03 19:25:24

标签: kotlin

在Kotlin中,是否可以使用工厂函数创建具有私有构造函数的类的实例?

我的目标是强制使用工厂函数并通过类的构造函数阻止实例化。

示例:

// factory function, valid
val myInstance = myClassOf()

// class instantiation, invalid
val myInstance = MyClass()

我试图模仿某些内置工厂函数的行为,例如intArrayOf(),例如。

// works
val myIntArray = intArrayOf()

// not possible as IntArray has a private constructor
val myIntArray = IntArray()

3 个答案:

答案 0 :(得分:6)

您可以这样使用companion object

each

如果工厂函数具有特殊含义,则将其命名。例如:

class MyClass private constructor() {
  companion object {
    operator fun invoke() = MyClass()
  }
}

val myInstance = MyClass() // Calls the factory function invoke()

答案 1 :(得分:5)

您可以这样做:

import MyClass.Companion.myClassOf

class MyClass private constructor() {
    companion object {
        fun myClassOf() = MyClass()
    }
}

//val myInstance1 = MyClass() // not allowed
val myInstance2 = myClassOf()

答案 2 :(得分:1)

尝试使用Builder。

 ref= FirebaseDatabase.getInstance().getReference()
                .child("Users");
 ref.equalTo("Youtubers").addListenerForSingleValueEvent(new ValueEventListener() {
          @Override
          public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
              if(dataSnapshot.exists()){
for(DataSnapshot child:dataSnapshot.getChildren()){
  if(child.getKey().equals("Youtubers")){
        youtuber_id=child.getValue().toString();

     dataSnapshot.getChildren().iterator().next().getValue().toString();

  }
} } }

参考:https://www.baeldung.com/kotlin-builder-pattern