2011-12-07 12 views

答えて

11

まず、あなたが書くときことを知っている必要があり:

class Person(val name: String, val age: Int) { 
    ... 
} 

nameageはインスタンス変数ではなく、デフォルトではパブリックなメソッド(ゲッター)を、アクセサ。

あなたの代わりに書く場合:

class Person(name: String, age: Int) { 
    ... 
} 

nameageは、あなたが期待できるとして、民間だけインスタンス変数、です。

スカラの哲学は、不変のインスタンス変数を好むことであり、パブリックアクセサメソッドを持つことはもはや問題ではありません。

+3

2番目の例では、 'name'と' age'は、 'Person'の本体でどのように使用されているかに応じて、インスタンス変数ではなく、単にコンストラクタパラメータになります。 –

+0

はい、あなたは正しいです、私は答えを複雑にしたくありませんでした。 – paradigmatic

5

プライベートはモノリスを推奨します。プライベートになるいくつかの変数を読み込む必要があるため、無関係な機能をクラスに入れるのが簡単になると、クラスが成長し始めます。

これは単なる悪いデフォルトであり、Javaで1000行以上のクラスを持つ大きな理由の1つです。

Scalaのデフォルトはimmutableです。これは、多くの人がJavaで制限するためにプライベートに使用することが多い膨大な種類のエラーを削除します。多くの場所で好まれるimmutablesと

3
  1. 、国民が問題
  2. のそれほどではありません、あなたはので、あなたが必要としない、クライアントコードを変更せずにゲッターとセッターと公共のvalを置き換えることができますあなたが必要とする場合に備えてゲッターとセッターの余分な層。 (実際には、その層を得るのですが、あなたはほとんどの時間をそれに気づくことはありません。)
  3. プライベートフィールド+公共セッターとゲッターのJavaのアンチパターンはかなりとにかく
3

(追加のカプセル化していません

フィールドのJavaカプセル化の背後にある主要な要因は、統一されたアクセスポリシーです。つまり、単純にフィールドが実装されたかどうかを気にする必要はありませんでした。飛行機。これは、クラスのメンテナが、必要に応じて2つのクラスを切り替えることができるという大きな利点があります。他のクラスを変更する必要はありません。

Javaでは、必要に応じて値を計算するための構文上の柔軟性を提供するために、すべてのメソッドにアクセスする必要がありました。

スカラでは、メソッドとフィールドには同等の構文でアクセスすることができます。単純なプロパティがある場合は、後でno-argメソッドとして公開することができるため、カプセル化に損失はありません発信者が変更について何かを知る必要はありません。

関連する問題