Wenn wir ein Final in Java erstellen, ist garantiert, dass es auch zur Laufzeit nicht geändert werden kann, weil die JVM dies garantiert.Scala - Wie wird Val-Immutability zur Laufzeit garantiert
Java-Klasse:
public class JustATest {
public final int x = 10;
}
javap dekompilierten:
Zusammengestellt von "JustATest.java"
public class JustATest {
public final int x;
public JustATest();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: aload_0
5: bipush 10
7: putfield #2 // Field x:I
10: return
}
Aber in scala, erklären, wenn wir eine val
, es kompiliert in eine normale ganze Zahl und es gibt keinen Unterschied zwischen var und val in t Erms der Dekompilierung ausgegeben.
Original-Scala Klasse:
class AnTest {
val x = 1
var y = 2
}
dekompilierten Ausgang:
Compiled from "AnTest.scala"
public class AnTest {
public int x();
Code:
0: aload_0
1: getfield #14 // Field x:I
4: ireturn
public int y();
Code:
0: aload_0
1: getfield #18 // Field y:I
4: ireturn
public void y_$eq(int);
Code:
0: aload_0
1: iload_1
2: putfield #18 // Field y:I
5: return
public AnTest();
Code:
0: aload_0
1: invokespecial #25 // Method java/lang/Object."<init>":()V
4: aload_0
5: iconst_1
6: putfield #14 // Field x:I
9: aload_0
10: iconst_2
11: putfield #18 // Field y:I
14: return
}
Mit diesen Informationen das Konzept der Unveränderlichkeit eines val
wird nur bei der Kompilierung durch den scala Compiler gesteuert ? Wie ist dies zur Laufzeit garantiert?
Wie Sie sagten, ist die Val-Unveränderlichkeit nur zur Kompilierzeit garantiert. Und Sie können tatsächlich ein val mithilfe der Laufzeitreflexion mutieren. –
Die einzige Möglichkeit, einen Laufzeitwert zu ändern, besteht darin, dass Sie Reflektionen in Ihrem Code vornehmen. Welche Art von "Laufzeitgarantien" suchen Sie? –
@YuvalItzchakov: Das Konzept einer Wert-Unveränderlichkeit ist in Java nicht vorhanden, d. H. Ein Int kann sich ändern, aber im Falle von Scala garantiert ein Wert, dass es nicht geändert werden kann. In diesem Fall, wie wird dies mit dem jvm kommuniziert, da sich ein val nicht wie ein endgültiges –