2017-07-19 19 views
1

次のコードAは、Kotlin-for-Android-Developersのものです。コードBは私によって書かれています。暗黙的なプロパティタイプは、明示的なプロパティタイプと同じですか?

これらの2つの異なるコードブロックは同じように機能しますか?

コードA

class DetailActivity : AppCompatActivity(), ToolbarManager { 

    override val toolbar by lazy { find<Toolbar>(R.id.toolbar) } 

    ...  
} 

コードB

class DetailActivity : AppCompatActivity(), ToolbarManager { 

    override val toolbar: Toolbar by lazy { find<Toolbar>(R.id.toolbar) } 

    ...  
} 
+0

テストをし、参照:):[1]

// v--- the property type 'Toolbar' is inferred at compile-time override val toolbar/*:Toolbar*/ by lazy { find<Toolbar>(R.id.toolbar) } 

:コンパイラは、例えば、コンパイル時にコードにおける実際のプロパティの型を推論するので – Michael

答えて

3

ビューの構造観点から、それらは同じです。 Kotlinコンパイラはソースコードの同一のJavaバイトコードを発するであろう、以下のように好き両方:

private final Lazy<Toolbar> toolbarProvider = lazy(()-> find(R.id.toolbar)); 

public Toolbar getToolbar(){ 
     return toolbarProvider.getValue(); 
} 

プロパティタイプは、コードB上に任意であるが、界面ではなく実装することによってプログラミングするときに有用である[1]実装が変更された場合、変更する必要があるのは、toolbarの使用がそのサブクラスで宣言されたフィーチャにアクセスできないため、インスタンス化される場所のみです。例えば:

//declare as abstract supertype ---v 
override val toolbar: AbstractToolbar by lazy { find<Toolbar>(R.id.toolbar) } 
//             ^
//when implementation was changed only need to change here. 
//e.g:change the `Toolbar` to other subtype of AbstractToolbar: find<MiniToolbar>() 

ビューのコンパイラ観点から、彼らは異なっています。 https://en.wikipedia.org/wiki/Liskov_substitution_principle

関連する問題