Closed as not planned
Description
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