2016-10-15 5 views
-3

私はScalaとAkkaの既存のプロジェクトに取り掛かります。私はScalaクラスを、いくつかのフィールドはプライベートクラスとし、getterメソッドとsetterメソッドを別々に提供しています。なぜあなたはそれを公にすることもできるのです。Scala - なぜプライベートメンバー

私は

なぜ、このように私のプロジェクトで言う

person.age = 99 

なぜこの簡単な方法:だから、あなたは、公共のように同じ感覚を得ることができ

class Person() { 
// Private age variable, renamed to _age 
private var _age = 0 
var name = "" 

// Getter 
def age = _age 

// Setter 
def age_= (value:Int):Unit = _age = value 
} 

class Person() { 
var name = "" 
var age = 0 
} 

// Instantiate a person object 
person = new Person() 

// Print the object's age and name properties 
println(person.age) 
println(person.name) 


// Set the properties to different values 
person.age = 34 
person.name = "Dustin Martin" 
+0

http://stackoverflow.com/questions/1568091/why-use-getters-and-を複製setter – pamu

+1

これはデータカプセル化と呼ばれ、OOプログラミングの主要な原則の1つですhttps://en.wikipedia.org/wiki/Object-oriented_programming – iuriisusuk

答えて

1

クラスのデータメンバーに直接アクセスしたり変更したりするのは悪い考えです。その理由は、変更可能なデータメンバをprivateと宣言し、パブリックゲッタとセッタにアクセスしてそれを変更する(データメンバ)という良い方法です。

1)そのあなたがゲッター

def age = if (_age >= 18) _age else throw new Exception("minor") 

のために、この

のようなゲッターとセッターでいくつかの検証を追加することができます

2)可変状態へのアクセスを制御する必要があるので、良い練習セッター用

def age_=(age: Int) = if (age < 18) throw new Exception("minor") else _age = age 
+3

いいえ、これはScalaではまったく適していません。 http://stackoverflow.com/questions/1568091/why-use-getters-and-settersの質問は、 'var'はすでにパブリックフィールドではなく、getter/setterメソッドのペア(およびプライベートフィールド)であるため、関係しません。 。あなたが欲しいときなどまたは変更可能なメンバのgetterのみを提供する場合は、以前は明示的なgetters/setterを使用しないでください。 –

+1

「それは良い練習だ」という理由は正当な理由がない – dhg

2

どちらも悪いです。あなたが特定の事例でそれらを使用する特定の理由がない限り、クラス内の変更可能なメンバーを避けてください。

case class Person(name: String, age: Int) { 
    def rename(newName: String) = copy(newName) 
    def grow(numYears: Int) = copy(age = this.age + numYears) 
} 

val teen = Person("John", 15) 
val adult = teen.grow(5) 

など

0

まあそれカプセル化について主に語っています。オブジェクトの世界によると、アクションはでのみ達成する必要があります。たとえば、アクセルを踏むことなく車で100kmに到達することはできません。したがって、車速100kmph(状態)は加速(動作)によってにのみ達成されます。ゲッターとセッターの

Scalaのスタイルはあなたに少し混乱を与えるが(最初の日の間に)すべての構文の混乱のthatsが、Scalaはカプセル化に一切の妥協もしないことがあります。ゲッターとセッターの

class Car (@BeanProperty val model:String, @BeanProperty val make:String) { 

} 

以下のJavaビーンスタイルがdynamically.But @BeanPropertyは、Javaの相互運用性のために意味されて生成されるであろうように、あなたはまだゲッターとセッターのJavaのスタイルを使用することができます。 For more info

3

この特定の場合、理由はありません。それが実際のプロジェクトのものであれば、これはおそらくその事実を理解していない人の例からコピーされたでしょう。 Scalaで明示的なgetter/setterメソッドを使用したいのは、private変数を変更するだけでなく、以外のを実行するときだけです。

(そしてディマの答えは、正しく言うように、あなたは最初の場所でvarを持たないように試してみてください。)

関連する問題