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

Preview:

DESCRIPTION

 

Citation preview

Copyright(c) Yusuke Yamamoto All rights reserved.

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

2011/7/7

Copyright(c) Yusuke Yamamoto All rights reserved.

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

• Twitter4J、”侍”などを開発

http://samuraism.jp/

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

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

Copyright(c) Yusuke Yamamoto All rights reserved.

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

• 未だにJava1.4.2で運用中

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

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

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

Copyright(c) Yusuke Yamamoto All rights reserved.

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

Copyright(c) Yusuke Yamamoto All rights reserved.

613

978

1688

Copyright(c) Yusuke Yamamoto All rights reserved.

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

978

1688

日前

Copyright(c) Yusuke Yamamoto All rights reserved.

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

978

1688

日前

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

Copyright(c) Yusuke Yamamoto All rights reserved.

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

978

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

日前

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

日前

Copyright(c) Yusuke Yamamoto All rights reserved.

社長

Copyright(c) Yusuke Yamamoto All rights reserved.

Java6、十分枯れてますね!

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 より

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

Copyright(c) Yusuke Yamamoto All rights reserved.

社長

Copyright(c) Yusuke Yamamoto All rights reserved.

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

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

Copyright(c) Yusuke Yamamoto All rights reserved.

社長

Copyright(c) Yusuke Yamamoto All rights reserved.

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

Copyright(c) Yusuke Yamamoto All rights reserved.

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

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)

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

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

Copyright(c) Yusuke Yamamoto All rights reserved.

そこで・・・

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+互換のバイトコードを生成

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 ✔ ✔ ✔

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 ✔ ✔ ✔

注意!

注意!

Copyright(c) Yusuke Yamamoto All rights reserved.

Java1.4.2における注意点

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

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

• enumは使えない

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

アノテーション enum

1.4.2

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;

Copyright(c) Yusuke Yamamoto All rights reserved.

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

‣ 例えば String#contains()

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

Copyright(c) Yusuke Yamamoto All rights reserved.

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

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

Recommended