2018年8月6日月曜日

Kotlin メモ : padStart, padEnd

padStart(length: Int, padChar: Char = ' ')
padEnd(length: Int, padChar: Char = ' ')

CharSequence と String の拡張関数として用意されています。

length で指定した長さに足りない場合、padChar で start/end を埋めたものを返します。
padChar を省略した場合、' ' が使われます。

assertThat("a".padStart(3)).isEqualTo(" a") assertThat("aa".padStart(3)).isEqualTo(" aa") assertThat("aaa".padStart(3)).isEqualTo("aaa") assertThat("aaaa".padStart(3)).isEqualTo("aaaa") assertThat("a".padStart(3, '-')).isEqualTo("--a") assertThat("aa".padStart(3, '-')).isEqualTo("-aa") assertThat("aaa".padStart(3, '-')).isEqualTo("aaa") assertThat("aaaa".padStart(3, '-')).isEqualTo("aaaa") assertThat("a".padEnd(3)).isEqualTo("a ") assertThat("aa".padEnd(3)).isEqualTo("aa ") assertThat("aaa".padEnd(3)).isEqualTo("aaa") assertThat("aaaa".padEnd(3)).isEqualTo("aaaa") assertThat("a".padEnd(3, '-')).isEqualTo("a--") assertThat("aa".padEnd(3, '-')).isEqualTo("aa-") assertThat("aaa".padEnd(3, '-')).isEqualTo("aaa") assertThat("aaaa".padEnd(3, '-')).isEqualTo("aaaa")

2018年8月1日水曜日

Android で Dagger を使う(その4 : @BindsInstance)

Android では @Provides の引数として Application が必要だったり、@Inject で Application を渡したいことがあります。

Module のコンストラクタで Application のインスタンスを渡すようにすることで実現できますが、もっといい方法があります。

まず Component に @Component.Builder をつけた Builder インターフェースを用意します。
インタフェースの中に @BindsInstance アノテーションをつけたメソッドを用意し、Application インスタンスを渡せるようにします。 @Component( modules = [ AppModule::class ] ) internal interface AppComponent { @Component.Builder interface Builder { fun build(): AppComponent @BindsInstance fun application(application: Application): Builder } ... } あとは Component を構成するときに、用意したメソッドで Application インスタンスを渡すだけです。 class MyApplication : Application() { override fun onCreate() { super.onCreate() val appComponent = DaggerAppComponent .builder() .application(this) .build() ... } } 生成されたコードでは DaggerAppComponent が application インスタンスを保持し、MembersInjector や Factory に適宜渡しています。