これは仮定の質問です。状況は以下の通りである:私は、プライベートフィールドの値を変更するにはKotlinファイルからJavaクラスのセッターを呼び出していますx
javaFoo.setX(420)
IDEには、それを変更することを提案します
javaFoo.x = 420
それは正常に動作します。
今セッターはそれのいくつかの複雑な機能の内部を持ち、後に仮定x
のJavaクラス内のフィールドに変更されるpublic
代わりにprivate
。そこには、コンパイルエラーできなくなりますが、Kotlinコールはの値を変更しますx
セッターで起こる他のものをスキップし、そしてそれは論理エラーを引き起こして見過ごさ行くことができます。したがって、私は疑問に思って:それはJavaのフィールドを設定するKotlinプロパティアクセスの構文を使用しても安全ですか?
言語の意味論のあなたの分析が正しいです。あなたが記述ターゲットクラス上の変更は、実際にKotlinのプロパティアクセスの構文の意味を変更します。しかし、その事実は、その構文を使用しているかどうかを尋ねるあなたの質問、回答する際に考慮すべき唯一のものではない安全を。
任意の現実の制約なしに仮想シナリオを議論するとき、ほとんど何が可能であり、何の言語構造は、そのビューの下に「安全」ではありません。どのような一日、場合、Kotlinチームは、の意味を変更することを決めたx++
「リターンを意味するようにx
変更していない、乗x
」?理論的には、それが可能です。これは、しかし、そうですか?
あなたの質問に同じ常識的なロジックを適用すると、クラスのメンテナがこれまでにカスタムロジックとセッターの背後に隠されているフィールドのカプセル化を破ることを決定したシナリオは、極めてまれです。あなたはすべてのJavaライブラリプロジェクトの履歴分析を行う場合には実際には、あなたはおそらく、この今までに起こったの単一のインスタンスを見つけることができません。
それはあなたの仮定のシナリオは、ショートカット構文を使用して実際の問題から気晴らしとして見ることができる、と述べました。これは厄介な、それが私たちの直感を壊すので、カスタム・ロジックとセッターを呼び出すためにそれを使用するために誤解を招くことができます。
Androidでは、その一例ですImageView.get/setImageMatrix
。あなたは書ける
imageMatrix.rotate = 30
そしてそれが効果を持つことを期待し、実際に、あなたが書いたコードが壊れています。あなたが実際に書かれているはずです
val tmpMatrix = Matrix()
tmpMatrix.set(imageMatrix)
tmpMatrix.rotate = 30
imageMatrix = tmpMatrix
私たちのJava直感することで、一見無目的のためのオブジェクトの割り当てを無駄に、ルックスが壊れていることを、実際にこのバージョンです。しかし、あなたは契約を読めばsetImageMatrix
、あなたはそれがかなり多く、単にフィールドに自分のオブジェクトを割り当てるより行い実現う、それは実際に画像表示に変換を適用します。同様に、ゲッターの契約は、返されたオブジェクトを変異禁止します。
私はKotlinのこの機能の上に多くの引数を見ていないが、私は、Javaから移行する人々のためのバグの潜在的な供給源として、それを参照してください。進むべき道は、Kotlinにおける任意のプロパティへのアクセスは、より多くの目を満たしているよりも、意味するかもしれないという事実に自分自身を感作、あなたの直感を再訓練することです。