Skip to content

Instantly share code, notes, and snippets.

@kmizu
Last active July 12, 2019 05:55
Show Gist options
  • Save kmizu/9c3c0e4ea559b29aa229bbb669db4f02 to your computer and use it in GitHub Desktop.
Save kmizu/9c3c0e4ea559b29aa229bbb669db4f02 to your computer and use it in GitHub Desktop.
Effect of explicit final modifier for an object definition (it depends on scalac's implementation detail)
final object ExplicitlyFinalObject {
val NonFinalVal = 1
final val FinalVal = 2
}
object ImplicitlyFinalObject {
val NonFinalVal = 1
final val FinalVal = 2
}
$ scalac -version
Scala compiler version 2.13.0 -- Copyright 2002-2019, LAMP/EPFL and Lightbend, Inc.
$ javap -c -verbose ExplicitlyFinalObject
Classfile /.../work/ExplicitlyFinalObject.class
Last modified 2019/07/12; size 703 bytes
MD5 checksum e2447991d79f4264136f54c01ed3b7ed
Compiled from "BehaviorOfFinal.scala"
public final class ExplicitlyFinalObject
minor version: 0
major version: 52
flags: (0x0031) ACC_PUBLIC, ACC_FINAL, ACC_SUPER
this_class: #2 // ExplicitlyFinalObject
super_class: #4 // java/lang/Object
interfaces: 0, fields: 0, methods: 2, attributes: 3
Constant pool:
#1 = Utf8 ExplicitlyFinalObject
#2 = Class #1 // ExplicitlyFinalObject
#3 = Utf8 java/lang/Object
#4 = Class #3 // java/lang/Object
#5 = Utf8 BehaviorOfFinal.scala
#6 = Utf8 Lscala/reflect/ScalaSignature;
#7 = Utf8 bytes
#8 = Utf8 \u0006\u0005\t:Qa\u0002\u0005\t\u0006-1Q!\u0004\u0005\t\u00069AQ!F\u0001\u0005\u0002YAqaF\u0001C\u0002\u0013\u0005\u0001\u0004\u0003\u0004\u001d\u0003\u0001\u0006I!\u0007\u0005\b;\u0005\u0011\r\u0011\"\u0002\u001f\u0011\u0019\t\u0013\u0001)A\u0007?\u0005)R\t\u001f9mS\u000eLG\u000f\\=GS:\fGn\u00142kK\u000e$(\"A\u0005\u0002\u000fq*W\u000e\u001d;z}\r\u0001\u0001C\u0001\u0007\u0002\u001b\u0005A!!F#ya2L7-\u001b;ms\u001aKg.\u00197PE*,7\r^\n\u0003\u0003=\u0001\"\u0001E\n\u000e\u0003EQ\u0011AE\u0001\u0006g\u000e\fG.Y\u0005\u0003)E\u0011a!\u00118z%\u00164\u0017A\u0002\u001fj]&$h\bF\u0001\f\u0003-quN\u001c$j]\u0006dg+\u00197\u0016\u0003e\u0001\"\u0001\u0005\u000e\n\u0005m\t\"aA%oi\u0006aaj\u001c8GS:\fGNV1mA\u0005Aa)\u001b8bYZ\u000bG.F\u0001 \u001f\u0005\u0001S$\u0001\u0002\u0002\u0013\u0019Kg.\u00197WC2\u0004\u0003
#9 = Utf8 FinalVal
#10 = Utf8 ()I
#11 = Utf8 ExplicitlyFinalObject$
#12 = Class #11 // ExplicitlyFinalObject$
#13 = Utf8 MODULE$
#14 = Utf8 LExplicitlyFinalObject$;
#15 = NameAndType #13:#14 // MODULE$:LExplicitlyFinalObject$;
#16 = Fieldref #12.#15 // ExplicitlyFinalObject$.MODULE$:LExplicitlyFinalObject$;
#17 = NameAndType #9:#10 // FinalVal:()I
#18 = Methodref #12.#17 // ExplicitlyFinalObject$.FinalVal:()I
#19 = Utf8 NonFinalVal
#20 = NameAndType #19:#10 // NonFinalVal:()I
#21 = Methodref #12.#20 // ExplicitlyFinalObject$.NonFinalVal:()I
#22 = Utf8 Code
#23 = Utf8 SourceFile
#24 = Utf8 RuntimeVisibleAnnotations
#25 = Utf8 ScalaSig
{
public static int FinalVal();
descriptor: ()I
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=0, args_size=0
0: getstatic #16 // Field ExplicitlyFinalObject$.MODULE$:LExplicitlyFinalObject$;
3: invokevirtual #18 // Method ExplicitlyFinalObject$.FinalVal:()I
6: ireturn
public static int NonFinalVal();
descriptor: ()I
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=0, args_size=0
0: getstatic #16 // Field ExplicitlyFinalObject$.MODULE$:LExplicitlyFinalObject$;
3: invokevirtual #21 // Method ExplicitlyFinalObject$.NonFinalVal:()I
6: ireturn
}
SourceFile: "BehaviorOfFinal.scala"
RuntimeVisibleAnnotations:
0: #6(#7=s#8)
scala.reflect.ScalaSignature(
bytes="\u0006\u0005\t:Qa\u0002\u0005\t\u0006-1Q!\u0004\u0005\t\u00069AQ!F\u0001\u0005\u0002YAqaF\u0001C\u0002\u0013\u0005\u0001\u0004\u0003\u0004\u001d\u0003\u0001\u0006I!\u0007\u0005\b;\u0005\u0011\r\u0011\"\u0002\u001f\u0011\u0019\t\u0013\u0001)A\u0007?\u0005)R\t\u001f9mS\u000eLG\u000f\\=GS:\fGn\u00142kK\u000e$(\"A\u0005\u0002\u000fq*W\u000e\u001d;z}\r\u0001\u0001C\u0001\u0007\u0002\u001b\u0005A!!F#ya2L7-\u001b;ms\u001aKg.\u00197PE*,7\r^\n\u0003\u0003=\u0001\"\u0001E\n\u000e\u0003EQ\u0011AE\u0001\u0006g\u000e\fG.Y\u0005\u0003)E\u0011a!\u00118z%\u00164\u0017A\u0002\u001fj]&$h\bF\u0001\f\u0003-quN\u001c$j]\u0006dg+\u00197\u0016\u0003e\u0001\"\u0001\u0005\u000e\n\u0005m\t\"aA%oi\u0006aaj\u001c8GS:\fGNV1mA\u0005Aa)\u001b8bYZ\u000bG.F\u0001 \u001f\u0005\u0001S$\u0001\u0002\u0002\u0013\u0019Kg.\u00197WC2\u0004\u0003"
)
Error: unknown attribute
ScalaSig: length = 0x3
05 02 00
$ javap -c -verbose ImplicitlyFinalObject
Classfile /.../work/ImplicitlyFinalObject.class
Last modified 2019/07/12; size 703 bytes
MD5 checksum 0e4b771fe7ec6a25256e92073d5c8bd7
Compiled from "BehaviorOfFinal.scala"
public final class ImplicitlyFinalObject
minor version: 0
major version: 52
flags: (0x0031) ACC_PUBLIC, ACC_FINAL, ACC_SUPER
this_class: #2 // ImplicitlyFinalObject
super_class: #4 // java/lang/Object
interfaces: 0, fields: 0, methods: 2, attributes: 3
Constant pool:
#1 = Utf8 ImplicitlyFinalObject
#2 = Class #1 // ImplicitlyFinalObject
#3 = Utf8 java/lang/Object
#4 = Class #3 // java/lang/Object
#5 = Utf8 BehaviorOfFinal.scala
#6 = Utf8 Lscala/reflect/ScalaSignature;
#7 = Utf8 bytes
#8 = Utf8 \u0006\u0005\t:Qa\u0002\u0005\t\u0002-1Q!\u0004\u0005\t\u00029AQ!F\u0001\u0005\u0002YAqaF\u0001C\u0002\u0013\u0005\u0001\u0004\u0003\u0004\u001d\u0003\u0001\u0006I!\u0007\u0005\b;\u0005\u0011\r\u0011\"\u0002\u001f\u0011\u0019\t\u0013\u0001)A\u0007?\u0005)\u0012*\u001c9mS\u000eLG\u000f\\=GS:\fGn\u00142kK\u000e$(\"A\u0005\u0002\u000fq*W\u000e\u001d;z}\r\u0001\u0001C\u0001\u0007\u0002\u001b\u0005A!!F%na2L7-\u001b;ms\u001aKg.\u00197PE*,7\r^\n\u0003\u0003=\u0001\"\u0001E\n\u000e\u0003EQ\u0011AE\u0001\u0006g\u000e\fG.Y\u0005\u0003)E\u0011a!\u00118z%\u00164\u0017A\u0002\u001fj]&$h\bF\u0001\f\u0003-quN\u001c$j]\u0006dg+\u00197\u0016\u0003e\u0001\"\u0001\u0005\u000e\n\u0005m\t\"aA%oi\u0006aaj\u001c8GS:\fGNV1mA\u0005Aa)\u001b8bYZ\u000bG.F\u0001 \u001f\u0005\u0001S$\u0001\u0002\u0002\u0013\u0019Kg.\u00197WC2\u0004\u0003
#9 = Utf8 FinalVal
#10 = Utf8 ()I
#11 = Utf8 ImplicitlyFinalObject$
#12 = Class #11 // ImplicitlyFinalObject$
#13 = Utf8 MODULE$
#14 = Utf8 LImplicitlyFinalObject$;
#15 = NameAndType #13:#14 // MODULE$:LImplicitlyFinalObject$;
#16 = Fieldref #12.#15 // ImplicitlyFinalObject$.MODULE$:LImplicitlyFinalObject$;
#17 = NameAndType #9:#10 // FinalVal:()I
#18 = Methodref #12.#17 // ImplicitlyFinalObject$.FinalVal:()I
#19 = Utf8 NonFinalVal
#20 = NameAndType #19:#10 // NonFinalVal:()I
#21 = Methodref #12.#20 // ImplicitlyFinalObject$.NonFinalVal:()I
#22 = Utf8 Code
#23 = Utf8 SourceFile
#24 = Utf8 RuntimeVisibleAnnotations
#25 = Utf8 ScalaSig
{
public static int FinalVal();
descriptor: ()I
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=0, args_size=0
0: getstatic #16 // Field ImplicitlyFinalObject$.MODULE$:LImplicitlyFinalObject$;
3: invokevirtual #18 // Method ImplicitlyFinalObject$.FinalVal:()I
6: ireturn
public static int NonFinalVal();
descriptor: ()I
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=0, args_size=0
0: getstatic #16 // Field ImplicitlyFinalObject$.MODULE$:LImplicitlyFinalObject$;
3: invokevirtual #21 // Method ImplicitlyFinalObject$.NonFinalVal:()I
6: ireturn
}
SourceFile: "BehaviorOfFinal.scala"
RuntimeVisibleAnnotations:
0: #6(#7=s#8)
scala.reflect.ScalaSignature(
bytes="\u0006\u0005\t:Qa\u0002\u0005\t\u0002-1Q!\u0004\u0005\t\u00029AQ!F\u0001\u0005\u0002YAqaF\u0001C\u0002\u0013\u0005\u0001\u0004\u0003\u0004\u001d\u0003\u0001\u0006I!\u0007\u0005\b;\u0005\u0011\r\u0011\"\u0002\u001f\u0011\u0019\t\u0013\u0001)A\u0007?\u0005)\u0012*\u001c9mS\u000eLG\u000f\\=GS:\fGn\u00142kK\u000e$(\"A\u0005\u0002\u000fq*W\u000e\u001d;z}\r\u0001\u0001C\u0001\u0007\u0002\u001b\u0005A!!F%na2L7-\u001b;ms\u001aKg.\u00197PE*,7\r^\n\u0003\u0003=\u0001\"\u0001E\n\u000e\u0003EQ\u0011AE\u0001\u0006g\u000e\fG.Y\u0005\u0003)E\u0011a!\u00118z%\u00164\u0017A\u0002\u001fj]&$h\bF\u0001\f\u0003-quN\u001c$j]\u0006dg+\u00197\u0016\u0003e\u0001\"\u0001\u0005\u000e\n\u0005m\t\"aA%oi\u0006aaj\u001c8GS:\fGNV1mA\u0005Aa)\u001b8bYZ\u000bG.F\u0001 \u001f\u0005\u0001S$\u0001\u0002\u0002\u0013\u0019Kg.\u00197WC2\u0004\u0003"
)
Error: unknown attribute
ScalaSig: length = 0x3
05 02 00
$ javap -c -verbose -private ExplicitlyFinalObject$
Classfile /.../work/ExplicitlyFinalObject$.class
Last modified 2019/07/12; size 610 bytes
MD5 checksum 51c7d7ea5479bd77c6548e426d344704
Compiled from "BehaviorOfFinal.scala"
public final class ExplicitlyFinalObject$
minor version: 0
major version: 52
flags: (0x0031) ACC_PUBLIC, ACC_FINAL, ACC_SUPER
this_class: #2 // ExplicitlyFinalObject$
super_class: #4 // java/lang/Object
interfaces: 0, fields: 2, methods: 4, attributes: 3
Constant pool:
#1 = Utf8 ExplicitlyFinalObject$
#2 = Class #1 // ExplicitlyFinalObject$
#3 = Utf8 java/lang/Object
#4 = Class #3 // java/lang/Object
#5 = Utf8 BehaviorOfFinal.scala
#6 = Utf8 MODULE$
#7 = Utf8 LExplicitlyFinalObject$;
#8 = Utf8 NonFinalVal
#9 = Utf8 I
#10 = Utf8 <clinit>
#11 = Utf8 ()V
#12 = Utf8 <init>
#13 = NameAndType #12:#11 // "<init>":()V
#14 = Methodref #2.#13 // ExplicitlyFinalObject$."<init>":()V
#15 = NameAndType #6:#7 // MODULE$:LExplicitlyFinalObject$;
#16 = Fieldref #2.#15 // ExplicitlyFinalObject$.MODULE$:LExplicitlyFinalObject$;
#17 = NameAndType #8:#9 // NonFinalVal:I
#18 = Fieldref #2.#17 // ExplicitlyFinalObject$.NonFinalVal:I
#19 = Utf8 ()I
#20 = Utf8 this
#21 = Utf8 FinalVal
#22 = Methodref #4.#13 // java/lang/Object."<init>":()V
#23 = Utf8 Code
#24 = Utf8 LineNumberTable
#25 = Utf8 LocalVariableTable
#26 = Utf8 SourceFile
#27 = Utf8 ScalaInlineInfo
#28 = Utf8 Scala
{
public static final ExplicitlyFinalObject$ MODULE$;
descriptor: LExplicitlyFinalObject$;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
private static final int NonFinalVal;
descriptor: I
flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
public static {};
descriptor: ()V
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=0, args_size=0
0: new #2 // class ExplicitlyFinalObject$
3: dup
4: invokespecial #14 // Method "<init>":()V
7: putstatic #16 // Field MODULE$:LExplicitlyFinalObject$;
10: iconst_1
11: putstatic #18 // Field NonFinalVal:I
14: return
LineNumberTable:
line 1: 0
line 2: 10
line 1: 14
public int NonFinalVal();
descriptor: ()I
flags: (0x0001) ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: getstatic #18 // Field NonFinalVal:I
3: ireturn
LineNumberTable:
line 2: 0
LocalVariableTable:
Start Length Slot Name Signature
0 4 0 this LExplicitlyFinalObject$;
public final int FinalVal();
descriptor: ()I
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Code:
stack=1, locals=1, args_size=1
0: iconst_2
1: ireturn
LocalVariableTable:
Start Length Slot Name Signature
0 2 0 this LExplicitlyFinalObject$;
private ExplicitlyFinalObject$();
descriptor: ()V
flags: (0x0002) ACC_PRIVATE
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #22 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 5: 0
line 1: 4
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LExplicitlyFinalObject$;
}
SourceFile: "BehaviorOfFinal.scala"
Error: unknown attribute
ScalaInlineInfo: length = 0x13
01 01 00 03 00 0C 00 0B 01 00 15 00 13 01 00 08
00 13 01
Error: unknown attribute
Scala: length = 0x0
$ javap -c -verbose -private ImplicitlyFinalObject$
Classfile /.../work/ImplicitlyFinalObject$.class
Last modified 2019/07/12; size 610 bytes
MD5 checksum fe964aec3269c7e3381a4d2aad652616
Compiled from "BehaviorOfFinal.scala"
public final class ImplicitlyFinalObject$
minor version: 0
major version: 52
flags: (0x0031) ACC_PUBLIC, ACC_FINAL, ACC_SUPER
this_class: #2 // ImplicitlyFinalObject$
super_class: #4 // java/lang/Object
interfaces: 0, fields: 2, methods: 4, attributes: 3
Constant pool:
#1 = Utf8 ImplicitlyFinalObject$
#2 = Class #1 // ImplicitlyFinalObject$
#3 = Utf8 java/lang/Object
#4 = Class #3 // java/lang/Object
#5 = Utf8 BehaviorOfFinal.scala
#6 = Utf8 MODULE$
#7 = Utf8 LImplicitlyFinalObject$;
#8 = Utf8 NonFinalVal
#9 = Utf8 I
#10 = Utf8 <clinit>
#11 = Utf8 ()V
#12 = Utf8 <init>
#13 = NameAndType #12:#11 // "<init>":()V
#14 = Methodref #2.#13 // ImplicitlyFinalObject$."<init>":()V
#15 = NameAndType #6:#7 // MODULE$:LImplicitlyFinalObject$;
#16 = Fieldref #2.#15 // ImplicitlyFinalObject$.MODULE$:LImplicitlyFinalObject$;
#17 = NameAndType #8:#9 // NonFinalVal:I
#18 = Fieldref #2.#17 // ImplicitlyFinalObject$.NonFinalVal:I
#19 = Utf8 ()I
#20 = Utf8 this
#21 = Utf8 FinalVal
#22 = Methodref #4.#13 // java/lang/Object."<init>":()V
#23 = Utf8 Code
#24 = Utf8 LineNumberTable
#25 = Utf8 LocalVariableTable
#26 = Utf8 SourceFile
#27 = Utf8 ScalaInlineInfo
#28 = Utf8 Scala
{
public static final ImplicitlyFinalObject$ MODULE$;
descriptor: LImplicitlyFinalObject$;
flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL
private static final int NonFinalVal;
descriptor: I
flags: (0x001a) ACC_PRIVATE, ACC_STATIC, ACC_FINAL
public static {};
descriptor: ()V
flags: (0x0009) ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=0, args_size=0
0: new #2 // class ImplicitlyFinalObject$
3: dup
4: invokespecial #14 // Method "<init>":()V
7: putstatic #16 // Field MODULE$:LImplicitlyFinalObject$;
10: iconst_1
11: putstatic #18 // Field NonFinalVal:I
14: return
LineNumberTable:
line 5: 0
line 6: 10
line 5: 14
public int NonFinalVal();
descriptor: ()I
flags: (0x0001) ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: getstatic #18 // Field NonFinalVal:I
3: ireturn
LineNumberTable:
line 6: 0
LocalVariableTable:
Start Length Slot Name Signature
0 4 0 this LImplicitlyFinalObject$;
public final int FinalVal();
descriptor: ()I
flags: (0x0011) ACC_PUBLIC, ACC_FINAL
Code:
stack=1, locals=1, args_size=1
0: iconst_2
1: ireturn
LocalVariableTable:
Start Length Slot Name Signature
0 2 0 this LImplicitlyFinalObject$;
private ImplicitlyFinalObject$();
descriptor: ()V
flags: (0x0002) ACC_PRIVATE
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #22 // Method java/lang/Object."<init>":()V
4: return
LineNumberTable:
line 8: 0
line 5: 4
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this LImplicitlyFinalObject$;
}
SourceFile: "BehaviorOfFinal.scala"
Error: unknown attribute
ScalaInlineInfo: length = 0x13
01 01 00 03 00 0C 00 0B 01 00 15 00 13 01 00 08
00 13 01
Error: unknown attribute
Scala: length = 0x0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment