Java7シンタックスで レガシーコードを快適メンテナンス
-
Upload
yusuke-yamamoto -
Category
Technology
-
view
6.902 -
download
4
description
Transcript of Java7シンタックスで レガシーコードを快適メンテナンス
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シンタックスでレガシーコードを快適メンテナンス
ご静聴ありがとうございました