2013-07-27 渋谷Java #2 commons-langについてお話しました。
おや、日付が・・・。
ApacheCommons 2013-07-28 #渋谷Java #2Tomohiro Urakawa (@mystelynx)
View Slide
Agenda イントロダクション Apache Commons? lang まとめ
イントロダクション
分析力をコアとするマーケティングソリューションカンパニー • Webアプリ〜バッチアプリまで• Java / Groovy (Scala / Kotlin)系エンジニア• 猫好き
Apache Commons?
Apache Commons? Javaのための便利なライブラリ集 Jakarta commons? http://www.jajakarta.org/commons 「Jakarta Commonsの公式ホームページは http://jakarta.apache.org/commonsです。」を信じて飛ぶと、commons.apache.orgへジャンプするので、きっと同じもの。
Commons Proper 現役組 他のライブラリには極力依存しない! 後方互換性の維持! 43のサブプロジェクト!(2013/7/27調べ) Commons Sandbox 調整(実験)中の補欠組(17プロジェクト) Commons Dormant 戦力外(15プロジェクト)
lang
LangProvides extra functionalityfor classes in java.lang.
commons-lang3 ちなみに、2002/02/06J2SE 1.4 デビュー
使えるようにする org.apache.commonscommons-lang33.1
便利そうなやつら builder time exception
lang3.builder.* CompareToBuilder EqualsBuilder HashCodeBuilder ReflectionToStringBuilder ToStringBuilder
使用例 public int hashCode() {// you pick a hard-coded,//randomly chosen, non-zero, odd number// ideally different for each classreturn new HashCodeBuilder(17, 37).append(name).append(age).append(smoker).toHashCode();}
Effective Java
lang3.time.* FastDateFormat FastDateParser FastDatePrinter
きたか…!! ( ゚д゚) ガタッ / ヾ __L| / ̄ ̄ ̄/_ \/ /
期待していいの? ループ回数(回) FastDateFormat(ms) SimpleDateFormat(ms) 100,000 588 590 1,000,000 2476 2589 SimpleDateFormat s =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")FastDateFormat f =FastDateFormat.getInstance("yyyy-MM-dd HH:mm:ss")for (int i = 0; i < 100000; i++) {f.parse("2013-07-28 15:00:30");//s.parse("2013-07-28 15:00:30");}
スレッドセーフ? SimpleDateFormat FastDateFormat ・2スレッド・1000回フォーマットループNumberFormatExceptionの嵐 問題なし
実は・・・ FastDateFormatは、ver3.1の時点では「Dateを書式にそってformatし文字列にする」機能し提供していない! そして、Mavenのリポジトリに3.2は提供されていない(と思う)。使いたかったら自分でビルドする必要あり。
Joda-Time 使え。http://joda-time.sourceforge.net
lang3.exception.* ContextedException ContextedRuntimeException
独自例外作るのはいいけど スタックトレースと一緒に、どういう情報出せばいいんだっけ? 考えるのが面倒
try {...} catch (Exception e) {throw new ContextedRuntimeException("Error posting account transaction", e).addContextValue("Account Number", accountNumber).addContextValue("Amount Posted", amountPosted).addContextValue("Previous Balance", previousBalance)} org.apache.commons.lang3.exception.ContextedRuntimeException:java.lang.Exception: Error posting account transactionException Context:[1:Account Number=null][2:Amount Posted=100.00][3:Previous Balance=-2.17][4:Transaction Id=94ef1d15-d443-46c4-822b-637f26244899]
まとめ
まとめ commonsは、依存性も少ないし後方互換性も確保されているので、安心して使える。 StringBuffer全盛。※一部StringBuilderへ変わったりもしてる。 日付・時間関係はJoda-Time一択。 toString()や例外時の文字列出力に悩むくらいならビルダーやコンテキスト付き例外使って楽しよう。
ご静聴ありがとうございました!