Класс Scala с полем, отмеченным как защищенный в Java - PullRequest
3 голосов
/ 29 августа 2011

Я немного новичок в 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 ]

7 голосов
/ 29 августа 2011

Из-за принципа единого доступа все поля в Scala являются закрытыми. Но сгенерированные методы не являются. Так что вы можете сделать в Java:

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

Если вам некрасиво, вы можете использовать средства доступа к Java Beans .

2 голосов
/ 29 августа 2011

Попробуйте написать класс так:

import scala.reflect.BeanProperty

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

Тогда вы получите сгенерированные setId и getId методы согласно «стандартному» POJO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...