2017-09-01 9 views
0

私はkotlinを初めて使用しているため、この問題を把握することはできません。委任されたプロパティでカスタムゲッターを使用できません

私はnullableではないプロパティを使用している場合と使用していない場合があります。 私はそれが必要なときに初期化されるように怠惰な方法で委譲しました。

private val labelAnimator: ObjectAnimator by lazy { 
    ObjectAnimator.ofFloat(this, "floatingLabelFraction", 0f, 1f) 
} 

ただし、アクセスするたびにそのオブジェクトのプロパティも設定する必要があります。

fun getLabelAnimator(): ObjectAnimator { 
    labelAnimator.duration = (if (isFloatingLabelAnimating) 300 else 0).toLong() 
    return labelAnimator 
} 

ただし、プロパティが委任されているため、カスタムゲッターを使用することはできません。 これを可能な限り最良の方法で達成するにはどうすればよいですか?

+2

これはあなたの質問に答えることはできませんが、私はゲッタのプロパティを変更することを強くお勧めします。それは最小の驚きの原則に違反します。 –

答えて

0

私はKotlinの専門家ではありませんが、私にとっては間違っています。 lazyに委譲することで、最初のgetter呼び出しでinitオブジェクトを作成します。そして、カスタムゲッターを作成しようとしています。 そこに矛盾があります。たぶん

private val labelAnimator: ObjectAnimator by lazy { 
    val labelAnimator = ObjectAnimator.ofFloat(this, "floatingLabelFraction", 0f, 1f) 
    labelAnimator.duration = (if (isFloatingLabelAnimating) 300 else 0).toLong() 
    labelAnimator 
} 
+0

プロパティにアクセスするたびに新しいオブジェクトを作成しませんか? –

+0

あなたは絶対に正しいです!私は答えを編集する –

1

あなたは、たとえばBacking Propertyとして、あなたのオリジナルのプロパティを使用し、実際にそれに代表団としてプロパティを定義することができます。

private val _labelAnimator by lazy { 
    ObjectAnimator.ofFloat(this, "floatingLabelFraction", 0f, 1f) 
} 

val labelAnimator: ObjectAnimator 
    get() { 
     _labelAnimator.duration = if (isFloatingLabelAnimating) 300L else 0L 
     return _labelAnimator 
    } 

これは、あなたgetLabelAnimator()のJava方法及びKotlinで直接プロパティへのアクセスを提供します。

しかし、これまでに数回述べたように、このような動作を実装する最良の方法ではないかもしれません。シンプルな工場でも、オーバーヘッドが少なくても同じことができます。

関連する問題