2010-11-26 3 views

答えて

14

1つの場合、パブリックのvar/valを(2つの)カップルでスワップしても、バイナリ互換性を維持できます。次に、派生クラスでvar/valをオーバーライドすることができます。

10

まず、フィールドをパブリックにすると、クライアントはフィールドを読み書きできます。不変なオブジェクトを持つことは有益なので、フィールドを読み込み専用にすることをお勧めします(Scalaでは "var"ではなく "val"として宣言することで実現できます)。

あなたの実際の質問に戻ります。 Scalaでは、些細なバージョン以上のものが必要な場合は、独自のセッターとゲッターを定義することができます。これは不変量を維持するのに便利です。セッターの場合は、フィールドが設定されている値を確認することができます。フィールド自体を公開しておけば、そうする機会はありません。

これは "val"として宣言されたフィールドにも役立ちます。クラスの内部状態を表すArray [X]型のフィールドがあるとします。クライアントはこの配列への参照を取得して変更できるようになりました。この場合も、不変条件を確実に維持する機会はありません。しかし、独自のゲッターを定義することができるので、実際の配列のコピーを返すことができます。

参照型のフィールドをJavaで「final public」にすると、同じ引数が適用されます。クライアントは参照をリセットすることはできませんが、参照先のオブジェクトは変更します。

関連するメモ:Scalaのgettersでフィールドにアクセスすると、フィールドに直接アクセスするように見えます。これについての良い点は、フィールドへのアクセスを可能にし、オブジェクト上のパラメータを持たないメソッドを同じもののように呼び出すことができることです。したがって、フィールドに値を保存するのではなく、その場で値を計算したくないと判断した場合、クライアントは同じことを気にする必要はありません。Uniform Access Principle

8

簡潔に:統一アクセス原理。

valを使用すると、スーパークラスから抽象メソッドを実装できます。 2つの可能なサブクラス、円がバウンディングボックスで定義されたもの、それが中心と半径で定義のOneがあり

abstract class circle { 
    def bounds: Rectangle 
    def centre: Point 
    def radius: Double 
} 

:いくつかの架空のグラフィックパッケージから次の定義を想像してみてください。 UAPのおかげで、実装の詳細を完全に抽象化し、簡単に変更することができます。

3つ目の可能性があります:遅延値。これらは、我々のサークルの境界を何度も再計算するのを避けるために非常に便利ですが、均一なアクセスの原則なしにどのように怠惰な値を実装できるか想像するのは難しいです。

関連する問題