Last active
July 12, 2019 05:55
-
-
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)
This file contains hidden or 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
final object ExplicitlyFinalObject { | |
val NonFinalVal = 1 | |
final val FinalVal = 2 | |
} | |
object ImplicitlyFinalObject { | |
val NonFinalVal = 1 | |
final val FinalVal = 2 | |
} |
This file contains hidden or 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
$ 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