Я немного новичок в 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 ответа
Из-за принципа единого доступа все поля в Scala являются закрытыми. Но сгенерированные методы - нет. Итак, вы можете сделать в Java
:
Test test = new Test();
test.id_$eq( 23 );
System.out.println( test.id() ); //Should print "23"
Если вы сочтете это некрасивым, вы можете использовать средства доступа Java Beans.
Попробуйте написать такой класс:
import scala.reflect.BeanProperty
class Test {
@BeanProperty var id: Int = 0
}
Затем вы получите сгенерированные методы setId
и getId
в соответствии со "стандартным" POJO.
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].