Skip to content

Private class constructor is public at the bytecode level #12711

Closed as not planned
@julienrf

Description

@julienrf

Classes with private constructors are actually public at the bytecode level, this creates two issues:

  • it can be called from Java code
  • MiMa reports error if its signature changes

Reproduction steps

// Foo.scala
package bug

class Foo private (x: Int)

object Foo {
  def apply(x: Int) = new Foo(x)
}
// Bar.java
package bug

class Bar {
  public void bar() {
    Foo foo = new Foo(42);
  }
}

Output

The code compiles.

Expectation

The Java compilation should fail.

Possible solution

In a discussion, @smarter suggested to emit the constructor as ACC_SYNTHETIC to make it non-accessible from Java, and ignored by mima (see lightbend-labs/mima#92). Note that that change would still be binary compatible with possible existing Java code that would call such constructors (but it would be source incompatible).

Related Scala 3 issue: scala/scala3#16651

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions