前回の記事(JSR 269の勉強がてらFragment生成と引数周りを楽にするfragment-creatorというライブラリを作った - visible true)は0.4.0
を基にしており、その後いくつか書き方が変わったので差分を書いておきます。
本ライブラリはJitPackで配布しています。JitPackの設定をbuild.gradleに追加した上で以下をdependenciesに追加してください。
apt 'com.github.sys1yagi.fragment-creator:processor:0.6.0' compile 'com.github.sys1yagi.fragment-creator:library:0.6.0'
Builderの作り方が変わった
Builder.newInstance()
という命名はFragment#newInstance()
を想起させてややこしいという意見を貰ったので改善しました。具体的にはnewBuilder()
をCreatorに生やす形にしました。
before
MainFragment fragment = MainFragmentCreator.Builder .newInstance("keyword") // requiredな値はここで渡す .setUserId("userId") // optionalな値はsetterで渡す .build();
after
MainFragment fragment = MainFragmentCreator .newBuilder("keyword") // requiredな値はここで渡す .setUserId("userId") // optionalな値はsetterで渡す .build();
private fieldの利用
private fieldをサポートしました。setterを用意しておく必要があるのでご注意ください(リフレクションでsetしてもいいんですがそれだとコード生成している意味がないのでやってません)。
public MainFragment extends Fragment { @Args String keyword; @Args(require = false) private String userId; public String setUserId(String userId){ this.userId = userId; } }
Default値の設定
primitiveについてはDefault値の指定をサポートしました。引数がoptionalの場合利用できます。defaultString
とかdefaultInt
とかダサいんですがアノテーションには定数しか指定できないので仕方がなさそうです。Class<? extends DefaultValueProvider>
的なものを受け取ってゴニョゴニョしてもいいんですがprimitive typeの為にわざわざそういうクラス定義するのも大袈裟なので一旦defaultXXX
を列挙する形にしました。今後は複雑な値のデフォルト値や引数を変換する仕組みなど入れようかなとか考えてます。
public MainFragment extends Fragment { @Args(require = false, defaultString = "unknown") String keyword; @Args(require = false, defaultInt = -1) int userId; }
おわりに
JSR 269での生成周りのコード自身が結構単純作業でなかなか大変。