【问题标题】:Scala is not creating private constructor for companion classScala 没有为伴生类创建私有构造函数
【发布时间】:2015-09-09 17:20:58
【问题描述】:

我是 scala 的新手,并试图理解 scala oops 的概念。 我创建了一个类:

class MyComp private{
    // some fields and method goes here
    }

当我把它编译为

scalac MyComp.scala

它创建了一个私有构造函数。但是当我制作一个伴随对象而不是构造函数成为 public 时,我无法理解这个概念。请清除

这是 MyComp 类的伴生对象的代码

object MyComp
{
    private val comp= new MyComp;
    def getInstance= comp;
}

【问题讨论】:

  • 你如何评估构造函数是公共/私有的?
  • @GabrielePetronella 我运行 javap -private MyComp

标签: scala companion-object


【解决方案1】:

JVM 不理解伴生对象的概念(以及 scala 语言的其他概念)。

因此,scalac 不得不将MyComp 的构造函数以Java 字节码的形式公开,否则JVM 将不允许MyComp$(MyComp 的伴生类,通常称为模块类)实例化MyComp。这是因为从 JVM 的角度来看,MyComp 和 MyComp$ 完全不相关。

Scalac 尽量保持可见性修饰符,但有时必须增加字节码中的可见性以支持某些特定于 Scala 的规则。

【讨论】:

  • 但是当没有伴生对象时,scala正在生成私有构造函数?
  • 我认为只是当伴生对象不使用私有构造函数时。所以同伴的存在并不重要。
  • 我同意你作为 JVM 的观点,因为当我创建另一个对象并尝试使用 new 实例化 MyComp 时发生编译错误
  • 回想一下,伴生对象可以访问类的私有成员,并且伴生对象被编译为单独的 Java(单例)类;因此,在 Java 运行时模型下,构造函数实际上不能是私有的。这通常是可以接受的,因为访问修饰符的实际好处是防止其他人意外调用内部代码(通过编译错误)。由于反射,该方法是可调用的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 2013-12-30
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多