読者です 読者をやめる 読者になる 読者になる

visible true

技術的なメモを書く

fragment-creator 0.6.0 released

前回の記事(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での生成周りのコード自身が結構単純作業でなかなか大変。