当前位置: 首页 > 知识库问答 >
问题:

在Kotlin中如何限制内部类的实例化只能在外部内部进行?

谭池暝
2023-03-14

有内在的

科特林拥有的:

class Outer {
    val insideCreatedInner: Inner = Inner()
    inner class Inner
}

val insideCreatedInner = Outer().insideCreatedInner // Should be visible and accessible
val outsideCreatedInner = Outer().Inner() // I want to disallow this

Java如何解决这个问题:

class Outer {
    Inner insideCreatedInner = new Inner();
    class Inner {
        private Inner() {}
    }
}

Outer.Inner insideCreatedInner = new Outer().insideCreatedInner;
Outer.Inner outsideCreatedInner = new Outer().new Inner(); // 'Inner()' has private access in 'Outer.Inner'

共有1个答案

段干安和
2023-03-14

已编辑:要使< code>val字段可见,同时隐藏< code>Inner构造函数,使用可见的接口并使实现私有可能会很有用:

class Outer {
    val insideInner: Inner = InnerImpl()

    interface Inner {
        // ...
    }
    private inner class InnerImpl : Inner {
        // ...
    }
}


val outer = Outer()
val outsideInner = outer.InnerImpl() // Error! Cannot access '<init>': it is private in 'Inner'
 类似资料:
  • 我是Java新手。 我的文件看起来像这样: 在另一个java文件中,我试图创建一个调用 但由于某种原因,我得到了一个错误: 有人能解释一下我怎么做我想做的事吗?我的意思是,我真的需要创建的实例,然后将其设置为,然后将的实例赋给该方法吗,还是有其他方法可以做到这一点?

  • 问题内容: 我是Java新手。 我的文件如下所示: 在另一个Java文件中,我试图创建A对象调用 但是由于某种原因我得到了错误: 有人可以解释我该怎么做吗?我的意思是,我真的需要创建的实例,然后设置实例,然后将实例提供给方法,还是有另一种方法呢? 问题答案: 在您的示例中,您有一个内部类,该内部类始终与外部类的实例绑定。 如果您想要的只是嵌套类以提高可读性而不是实例关​​联的一种方式,那么您需要一

  • 问题内容: 我有一个实用程序方法,当从中删除了不相关的逻辑时,简化的方法将如下所示: 问题是,如果是诸如的内部类,则该方法即使是公共方法也将不起作用,因为它将抛出。 有没有办法动态实例化内部类? 问题答案: 如果它是真正的 内部 类而不是 嵌套 (静态)类,则有一个隐式构造函数参数,它是对外部类实例的引用。在那个阶段您不能使用- 必须获得适当的构造函数。这是一个例子:

  • 问题内容: 我正在使用Apache Commons EqualsBuilder来为非静态Java内部类构建equals方法。例如: 除了声明方法之外,是否有可以参考的引用的语法?有点像(不起作用)? 问题答案: 没有。 最好的方法可能是您所建议的:将getFoo()方法添加到内部类中。

  • 这是我正在研究的一个更大问题的一个简短的子问题。 为什么我不能通过第8行outer class中的inner class的实例访问outer类字段? 字段在内部类中可见。 外部类中的非静态方法仍然存在此问题。 字段的可见性并不重要。无论从哪种方式,它都可以从内部类中看到。 可以通过内部类中的(私有)getter访问该字段,但我出现问题的原因之一是,我希望避免这些。 它应该成为不可变的构建器模式的一