首页 > 解决方案 > 有没有办法告诉 scala 编译器在编译匿名 scala 函数时生成私有方法?

问题描述

我有这个代码Foo.scala

object Foo extends App
{
    def bar() = () => println("hello")
    bar()()
}

如果我跑

scalac Foo.scala

我获得三个.class文件:

如果那时我跑

javap 'Foo$.class'

我上了标准输出

Compiled from "Foo.scala"
public final class Foo$ implements scala.App {
  public static Foo$ MODULE$;
  public static {};
  public java.lang.String[] args();
  public void delayedInit(scala.Function0<scala.runtime.BoxedUnit>);
  public void main(java.lang.String[]);
  public long executionStart();
  public java.lang.String[] scala$App$$_args();
  public void scala$App$$_args_$eq(java.lang.String[]);
  public scala.collection.mutable.ListBuffer<scala.Function0<scala.runtime.BoxedUnit>> scala$App$$initCode();
  public void scala$App$_setter_$executionStart_$eq(long);
  public final void scala$App$_setter_$scala$App$$initCode_$eq(scala.collection.mutable.ListBuffer<scala.Function0<scala.runtime.BoxedUnit>>);
  public scala.Function0<scala.runtime.BoxedUnit> bar();
  public static final void $anonfun$bar$1();
  public final void delayedEndpoint$Foo$1();
}

正如您所看到的,从该bar方法返回的 lambda 被编译成public static final void $anonfun$bar$1(); 我希望能够将我的 scala 代码中使用的所有 lambda 编译为私有方法而不是公共方法(当这些函数不应该成为问题只是局部方法变量,因为它们只能从声明它们的方法中访问)。有没有办法做到这一点?

PS我问是因为我正在使用Scala创建Java EE的EJB类,而与无接口视图一起使用的EJB类不能具有公共和最终的方法(必须可以实例化一个覆盖所有公共方法的子类创建代理)

标签: scalajakarta-ee

解决方案


推荐阅读