内部嵌套类的 Kotlin 工厂
Posted
技术标签:
【中文标题】内部嵌套类的 Kotlin 工厂【英文标题】:Kotlin Factory on Inner Nested Class 【发布时间】:2016-04-21 12:50:11 【问题描述】:我正在尝试使用伴随对象工厂方法(相当于 Java 中的静态工厂方法)在 Kotlin 中创建嵌套内部类。这是我的代码的简化版本。
class OuterClass
var myData:List<MyData> = List<>() //gets populated elsewhere
fun getItemFragment(position:Int) : Fragment()
return InnerClass.Factory.newInstance(position)
inner class InnerClass : Fragment()
companion object Factory
fun newInstance(position:Int) : InnerClass
var ic : InnerClass = InnerClass()
var bundle:Bundle = Bundle()
bundle.putInt("index", position)
ic.arguments = bundle
return ic
override fun onCreateView(inflater:LayoutInflater, container: ViewGroup, savedInstanceState:Bundle): View?
//create and return view, omitted. Need access to myData
编译器突出显示“companion”,表示“修饰符伴侣不适用于内部类”,它还突出显示 InnerClass() 调用,表示“表达式无法从嵌套类工厂访问”,使用“inner”关键字制作类内部。
如何使用相当于 Java 中的静态工厂方法来实现我在这里尝试做的事情?
【问题讨论】:
您永远不应该将 Fragment 设为内部类,因为它需要一个零参数的构造函数。有关该主题的更多信息:***.com/questions/15571010/… 【参考方案1】:你可以拥有:
class OuterClass
fun getItemFragment(position: Int): Fragment
return InnerClass.Factory.newInstance(position)
class InnerClass : Fragment()
companion object Factory
fun newInstance(position: Int): InnerClass
var ic: InnerClass = InnerClass()
return ic
但是,以下 不会在 Kotlin 中编译:
class Parent
inner class Nested
companion object Factory
出于同样的原因,以下将无法在 Java 中编译:
public class Parent
public class Nested
public static boolean create()
return false;
这里的罪魁祸首是 Kotlin 中嵌套的 inner
类,以及 Java 中的嵌套非静态类隐式引用了父类实例。由于 Kotlin 旨在与 Java 高度互操作,因此它遵循相同的规则。
请参阅以下问题以获得更深入的解释:
Why does Java prohibit static fields in inner classes? Why can't we have static method in a (non-static) inner class? up vote【讨论】:
你知道吗,这一切都说得通。发布问题后,我认为这也可能是 Java 限制。我只需要找到一种不同的方法。谢谢! 这样想:内部类需要一个所有者,你的静态初始化器如何知道所有者应该是谁? (外部类)以上是关于内部嵌套类的 Kotlin 工厂的主要内容,如果未能解决你的问题,请参考以下文章
kotlin学习之类的修饰符与抽象类,嵌套类,内部类,匿名内部类