はじめに
Javaでvarをとりあえず使って遊んで見ました。のザックリしたただのメモです。
Java 10がリリースされました!Java 9はほとんど触らなかった!
リリース日がちょうど祝日だったので少しだけ触りました。
一番遊んで見たくなるのが、
JEP286のvar のやつですよね。
これにより、ローカル変数でvarが使えるようになります。
JEP 286: Local-Variable Type Inference
遊んでみた
これつまり、Java 10 から、メソッド内で C# の匿名型と大体同等(少し記述量多いが)のことができる神機能では(?) pic.twitter.com/ybOXF4OnuC
— Kenji Yoshida (@xuwei_k) 2018年2月12日
↑これが一番嬉しいかもしれないですね
varをバーっと使ってみるか
— yank shaving (@yy_yank) 2018年3月21日
許されなかった pic.twitter.com/IuA984ZMpI
— yank shaving (@yy_yank) 2018年3月21日
丁寧なメッセージが表示される pic.twitter.com/nFuvXUfTsq
— yank shaving (@yy_yank) 2018年3月21日
これコンパイルエラーだっけ?
— yank shaving (@yy_yank) 2018年3月21日
var関係なさそうだけど pic.twitter.com/wD1V0PIDUK
以前から絶対成功しないキャストやinstanceofはコンパイル時にはじかれるhttps://t.co/Z4NCDYk2d6https://t.co/s7Kiochd1r
— zakki (@k_matsuzaki) 2018年3月21日
↑なるほど。つまり、jshellで同じメソッドスコープ内でinstanceofしたって感じだと思います。
遊んでみたのをまとめると
- 匿名型みたいなのを使えるのが嬉しい
- 匿名型みたいなののフィールドにはvarは使えない(ローカル変数ではないので当然か)
- varは予約語ではないので変数名には使えるが、class名には使えないしnewも出来ない
javapするとどうなるの?
これ、javap
するとどうなるんやろか。
ということで、簡単にこんなコードを
public class Sample { public static void main(String... args) { var hello = "Hello Java 10"; System.out.println(hello); } }コンパイルして、javapしてみると、、、、なんと?
Classfile /Users/yy_yank/Desktop/Sample.class Last modified 2018/03/26; size 425 bytes MD5 checksum 83c8871322855c30c9155844eec5ca9b Compiled from "Sample.java" public class Sample minor version: 0 major version: 54 flags: (0x0021) ACC_PUBLIC, ACC_SUPER this_class: #5 // Sample super_class: #6 // java/lang/Object interfaces: 0, fields: 0, methods: 2, attributes: 1 Constant pool: #1 = Methodref #6.#15 // java/lang/Object."<init>":()V #2 = String #16 // Hello Java 10 #3 = Fieldref #17.#18 // java/lang/System.out:Ljava/io/PrintStream; #4 = Methodref #19.#20 // java/io/PrintStream.println:(Ljava/lang/String;)V #5 = Class #21 // Sample #6 = Class #22 // java/lang/Object #7 = Utf8 <init> #8 = Utf8 ()V #9 = Utf8 Code #10 = Utf8 LineNumberTable #11 = Utf8 main #12 = Utf8 ([Ljava/lang/String;)V #13 = Utf8 SourceFile #14 = Utf8 Sample.java #15 = NameAndType #7:#8 // "<init>":()V #16 = Utf8 Hello Java 10 #17 = Class #23 // java/lang/System #18 = NameAndType #24:#25 // out:Ljava/io/PrintStream; #19 = Class #26 // java/io/PrintStream #20 = NameAndType #27:#28 // println:(Ljava/lang/String;)V #21 = Utf8 Sample #22 = Utf8 java/lang/Object #23 = Utf8 java/lang/System #24 = Utf8 out #25 = Utf8 Ljava/io/PrintStream; #26 = Utf8 java/io/PrintStream #27 = Utf8 println #28 = Utf8 (Ljava/lang/String;)V { public Sample(); descriptor: ()V flags: (0x0001) ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 1: 0 public static void main(java.lang.String...); descriptor: ([Ljava/lang/String;)V flags: (0x0089) ACC_PUBLIC, ACC_STATIC, ACC_VARARGS Code: stack=2, locals=2, args_size=1 0: ldc #2 // String Hello Java 10 2: astore_1 3: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream; 6: aload_1 7: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V 10: return LineNumberTable: line 4: 0 line 5: 3 line 6: 10 } SourceFile: "Sample.java"
なんとまあ普通。と思っては見たけれど大したこともなく。
コンパイルされた後は別に差がないですね。当たり前ですが。
所感
JVM言語や他の言語の後追い感は否めないですが、
このLocal-Variable Type Inferenceによって、色々副次的な効果とか出てくるんじゃないかなあとかそういう妄想をします。indyみたいな(多分ない)。
amberとかも入ってくると面白くなってくるんじゃないかなあと思います。
Project Amber
読んでおきたい(自分が)
Java10のvarをどう使うか - きしだのはてな
Style Guidelines for Local Variable Type Inference in Java
0 件のコメント:
コメントを投稿