Skip to content

Instantly share code, notes, and snippets.

@knutwalker
Created August 25, 2015 12:31
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save knutwalker/94830cd9194cba026655 to your computer and use it in GitHub Desktop.
Save knutwalker/94830cd9194cba026655 to your computer and use it in GitHub Desktop.
Demonstrates various possibilities to declare a val and the resulting bytecode
/**
* 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