Created
August 25, 2015 12:31
-
-
Save knutwalker/94830cd9194cba026655 to your computer and use it in GitHub Desktop.
Demonstrates various possibilities to declare a val and the resulting bytecode
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* Demonstrates various possibilities to declare a val and the resulting bytecode. | |
* | |
* Main takeaways are: | |
* - `private[this]` does not generate a getter and genertes direct field access | |
* - compile time constants are `final val x = e` with an optional modifier (§4.1) | |
* - final must be given, even if enclosing class is already final (§ 5.2 - 'final') | |
* - no type annotation may be present | |
*/ | |
final class Main { | |
/** | |
* Generates getter: | |
* | |
* public java.lang.String foo1(); | |
* 1: getfield #51 // Field foo1:Ljava/lang/String; | |
*/ | |
val foo1 = "bar1" | |
/** | |
* Generates getter: | |
* | |
* private java.lang.String foo2(); | |
* 1: getfield #55 // Field foo2:Ljava/lang/String; | |
*/ | |
private val foo2 = "bar2" | |
/** Doesn't generate a getter */ | |
private[this] val foo3 = "bar3" | |
/** | |
* Generates getter: | |
* | |
* public final java.lang.String foo4(); | |
* 0: ldc #57 // String bar4 | |
*/ | |
final val foo4 = "bar4" | |
/** | |
* Generates getter: | |
* | |
* private final java.lang.String foo5(); | |
* 0: ldc #59 // String bar5 | |
*/ | |
private final val foo5 = "bar5" | |
/** Doesn't generate a getter */ | |
private[this] final val foo6 = "bar6" | |
/** | |
* Generates getter: | |
* | |
* public final java.lang.String foo7(); | |
* 1: getfield #61 // Field foo7:Ljava/lang/String; | |
*/ | |
final val foo7: String = "bar7" | |
/** | |
* Generates getter: | |
* | |
* public final java.lang.String foo8(); | |
* 1: getfield #63 // Field foo8:Ljava/lang/String; | |
*/ | |
private final val foo8: String = "bar8" | |
/** Doesn't generate a getter */ | |
private[this] final val foo9: String = "bar9" | |
def run() { | |
println(foo1) // 4: invokevirtual #71 // Method foo1:()Ljava/lang/String; | |
println(foo2) // 14: invokespecial #77 // Method foo2:()Ljava/lang/String; | |
println(foo3) // 24: getfield #79 // Field foo3:Ljava/lang/String; | |
println(foo4) // 33: ldc #57 // String bar4 | |
println(foo5) // 41: ldc #59 // String bar5 | |
println(foo6) // 49: ldc #81 // String bar6 | |
println(foo7) // 58: invokevirtual #83 // Method foo7:()Ljava/lang/String; | |
println(foo8) // 68: invokespecial #85 // Method foo8:()Ljava/lang/String; | |
println(foo9) // 78: getfield #87 // Field foo9:Ljava/lang/String; | |
} | |
} | |
object Main extends App { new Main().run() } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment