2018年8月6日月曜日

Kotlin メモ : padStart, padEnd

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

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

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

  1. assertThat("a".padStart(3)).isEqualTo("  a")  
  2. assertThat("aa".padStart(3)).isEqualTo(" aa")  
  3. assertThat("aaa".padStart(3)).isEqualTo("aaa")  
  4. assertThat("aaaa".padStart(3)).isEqualTo("aaaa")  
  5.   
  6. assertThat("a".padStart(3'-')).isEqualTo("--a")  
  7. assertThat("aa".padStart(3'-')).isEqualTo("-aa")  
  8. assertThat("aaa".padStart(3'-')).isEqualTo("aaa")  
  9. assertThat("aaaa".padStart(3'-')).isEqualTo("aaaa")  
  10.   
  11. assertThat("a".padEnd(3)).isEqualTo("a  ")  
  12. assertThat("aa".padEnd(3)).isEqualTo("aa ")  
  13. assertThat("aaa".padEnd(3)).isEqualTo("aaa")  
  14. assertThat("aaaa".padEnd(3)).isEqualTo("aaaa")  
  15.   
  16. assertThat("a".padEnd(3'-')).isEqualTo("a--")  
  17. assertThat("aa".padEnd(3'-')).isEqualTo("aa-")  
  18. assertThat("aaa".padEnd(3'-')).isEqualTo("aaa")  
  19. 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 インスタンスを渡せるようにします。
  1. @Component(  
  2.         modules = [  
  3.             AppModule::class  
  4.         ]  
  5. )  
  6. internal interface AppComponent {  
  7.   
  8.     @Component.Builder  
  9.     interface Builder {  
  10.         fun build(): AppComponent  
  11.   
  12.         @BindsInstance  
  13.         fun application(application: Application): Builder  
  14.     }  
  15.   
  16.     ...  
  17. }  
あとは Component を構成するときに、用意したメソッドで Application インスタンスを渡すだけです。
  1. class MyApplication : Application() {  
  2.   
  3.     override fun onCreate() {  
  4.         super.onCreate()  
  5.   
  6.         val appComponent = DaggerAppComponent  
  7.                 .builder()  
  8.                 .application(this)  
  9.                 .build()  
  10.   
  11.         ...  
  12.     }  
  13. }  
生成されたコードでは DaggerAppComponent が application インスタンスを保持し、MembersInjector や Factory に適宜渡しています。