带有在java中标记为受保护的字段的Scala类

时间:2011-08-29 14:11:41

标签: java scala jvm

我对scala有点新意,并试图为我的公司测试一些东西。 我的问题如下: 有一个Scala类测试:

class Test {

  var id: Int = 0

}

执行javap -private -c测试:

Compiled from "Test.scala"
public class com.example.Test extends java.lang.Object implements scala.ScalaObject{
private int id;

public int id();
  Code:
   0:   aload_0
   1:   getfield        #11; //Field id:I
   4:   ireturn

public void id_$eq(int);
  Code:
   0:   aload_0
   1:   iload_1
   2:   putfield        #11; //Field id:I
   5:   return

public com.example.Test();
  Code:
   0:   aload_0
   1:   invokespecial   #19; //Method java/lang/Object."<init>":()V
   4:   aload_0
   5:   iconst_0
   6:   putfield        #11; //Field id:I
   9:   return

}

如您所见,id变量本身被标记为私有。如何强制Scala将其标记为受保护?真的没有办法......

2 个答案:

答案 0 :(得分:7)

由于uniform access principle,所有字段在Scala中都是私有的。但生成的方法不是。所以你可以在Java

Test test = new Test();
test.id_$eq( 23 );
System.out.println( test.id() ); //Should print "23"

如果您觉得难看,可以使用Java Beans accessors

答案 1 :(得分:2)

尝试像这样编写类:

import scala.reflect.BeanProperty

class Test {
  @BeanProperty var id: Int = 0
}

然后,根据“标准”POJO,您将获得生成的setIdgetId方法。