28
Copyright(c) Yusuke Yamamoto All rights reserved. Java7シンタックスで レガシーコードを快適メンテナンス 2011/7/7

Java7シンタックスで レガシーコードを快適メンテナンス

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

Java7シンタックスでレガシーコードを快適メンテナンス

2011/7/7

Page 2: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

@yusukey - 山本裕介• Java、JavaEEが好き

• Twitter4J、”侍”などを開発

http://samuraism.jp/

• Twitter APIポケットリファレンス

• 7月15日発売、予約受付中!

Page 3: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

Java7使いたい、Project Coin最高!だけど・・・

• 未だにJava1.4.2で運用中

• なぜか新規開発はJava5と決まっている

• 社内共通フレームワークがJava1.4.2+環境をサポートしなければならない

Java1.4.2 / Java5 が枯れていて安全という神話

Page 4: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

まずはJava7(or Java6)を使えるよう社長(?)を説得!

Page 5: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

613

978

1688

Page 6: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

Java5サポート終了2009年10月31日 613

978

1688

日前

Page 7: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

Java5サポート終了2009年10月31日 613

978

1688

日前

日前Java1.4.2サポート終了2008年10月31日

Page 8: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

Java5サポート終了2009年10月31日 613

978

1688Java6リリース2006年12月11日

日前

日前Java1.4.2サポート終了2008年10月31日

日前

Page 9: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

社長

Page 10: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

Java6、十分枯れてますね!

Page 11: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

無償ダウンロード Java for Business

Java6 1.6.0_26 1.6.0_26

Java5 1.5.0_22 1.5.0_30

Java1.4.2 1.4.2_19 1.4.2_32

http://www.oracle.com/technetwork/java/javase/6u26releasenotes-401875.html より

契約者のみダウンロード可能

Page 12: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

社長

Page 13: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

Java1.4.2、Java5、無料で使い続けるのは危険ですね

Page 14: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

Java5~7までの主な文法変更

• Java5

• Java6

• Java7

annotation, enum, generics, 拡張for文,

可変長引数, Auto(un)boxing

インターフェースへの@Override,

@GeneratedアノテーションString-switch, 数値リテラル区切り文字例外マルチキャッチ, ダイヤモンドオペレータtry-with-resources

Page 15: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

社長

Page 16: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

Java6、Java7使うと生産性向上しますよ!

Page 17: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

それでも説得に失敗した場合

Page 18: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

Java7のクラスをJava6で実行してみる

$ java -versionjava version "1.6.0_26"Java(TM) SE Runtime Environment (build 1.6.0_26-b03-384-10M3425)Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02-384, mixed mode)$ java -cp classes/ Java7GrammarException in thread "main" java.lang.UnsupportedClassVersionError: Java7Grammar : Unsupported major.minor version 51.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)

クラスファイルのバージョン不一致のため実行不可

Page 19: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

Java7のクラスをJava6で実行してみる

クラスの major version(クラスファイルの先頭7,8バイト目)48(0x30): Java1.449(0x31): Java550(0x32): Java651(0x33): Java7

majorminor

Unsupported major.minor version 51.0

Page 20: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

そこで・・・

Page 21: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

Java6以前で使えるようにコンパイル

$ javac -target 1.4 Java7Grammar.java javac: source release 1.7 requires target release 1.7

$ javac -target jsr14 Java7Grammar.java✔Java1.4.2+互換のバイトコードを生成

Page 22: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

-target jsr14による互換性アノテーション enum generics 拡張for文 可変長引数 autoboxing

1.4.2 ✔ ✔ ✔ ✔

5 ✔ ✔ ✔ ✔ ✔ ✔

6 ✔ ✔ ✔ ✔ ✔ ✔

String-switch数値リテラル区切り文字

例外マルチキャッチ <> try-with-resources

1.4.2 ✔ ✔ ✔5 ✔ ✔ ✔6 ✔ ✔ ✔

Page 23: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

-target jsr14による互換性アノテーション enum generics 拡張for文 可変長引数 autoboxing

1.4.2 ✔ ✔ ✔ ✔

5 ✔ ✔ ✔ ✔ ✔ ✔

6 ✔ ✔ ✔ ✔ ✔ ✔

String-switch数値リテラル区切り文字

例外マルチキャッチ <> try-with-resources

1.4.2 ✔ ✔ ✔5 ✔ ✔ ✔6 ✔ ✔ ✔

注意!

注意!

Page 24: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

Java1.4.2における注意点

• StringBuilderは使えない(APIに存在しない)

‣ + による文字列連結は通常コンパイル時にStringBuilderを使うよう最適化されるが、-target jsr14を指定した場合はStringBufferを使う

• enumは使えない

• ランタイムでアノテーションの評価はできない‣ アノテーションを書いてもエラーにはならないので@Overrideなどは大いに使うべき

アノテーション enum

1.4.2

Page 25: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

一般的な注意点

• 例外マルチキャッチブロック内で例外インスタンスの操作はできない

例外マルチキャッチ

1.4.256

Exception in thread "main" java.lang.NoClassDefFoundError: java/lang/ReflectiveOperationExceptionCaused by: java.lang.ClassNotFoundException: java.lang.ReflectiveOperationException

        } catch (NoSuchMethodException | ClassNotFoundException) { e.printStackTrace(); throw e;

Page 26: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

一般的な注意点• もちろん標準APIは導入された以降のバージョンでしか使えない

‣ 例えば String#contains()

Page 27: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

まとめ• Java7の文法は(だいたい)Java1.4.2~6でも使える

• Coinによる簡潔でメンテナンスしやすいコード

• 実行環境は枯れて安心なJava6!?

サンプルmavenプロジェクト

https://github.com/yusuke/java7grammar

Twitter4Jも -target jsr14 でコンパイルしてます

https://github.com/yusuke/twitter4j

Page 28: Java7シンタックスで レガシーコードを快適メンテナンス

Copyright(c) Yusuke Yamamoto All rights reserved.

Java7シンタックスでレガシーコードを快適メンテナンス

ご静聴ありがとうございました