内部嵌套类的 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基础(十三) 嵌套类内部类和匿名内部类

kotlin学习之类的修饰符与抽象类,嵌套类,内部类,匿名内部类

Kotlin——最详细的抽象类(abstract)内部类(嵌套类)详解

kotlin内部类与嵌套类

kotlin内部类与嵌套类

Kotlin学习—— 数据类,泛型,嵌套类与内部类,对象表达式和对象声明