2016-10-15 3 views
-3

Я начинаю работать над существующим проектом Scala и Akka. Я говорю классы Scala, некоторые поля делают их частными и предоставляют методы getter и setter по-разному. почему, как вы, вы можете сделать это публичным и правым.Scala - почему частный член тогда

Я говорю в моем проекте

Почему это так:

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 
} 

Таким образом, вы можете получить такое же чувство, как общественности:

person.age = 99 

Почему это не просто так?

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- seters – pamu

+1

, который называется инкапсуляцией данных и является одним из основных принципов программирования OO. https://en.wikipedia.org/wiki/Object-oriented_programming – iuriisusuk

ответ

1

Доступ к элементам данных и их изменение непосредственно являются плохими идеями. Вот почему его хорошая практика - объявить изменяемый элемент данных как private и предоставить публичному получателю и настройщику доступ и его изменение (член данных).

1) Сво хорошая практика, потому что доступ к изменяемым состоянием следует контролировать

2) Вы можете добавить некоторые проверки в поглотителе и сеттер, как этот

для добытчика

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

для сеттера

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 (и частным полем), а не публичным полем , Когда вы хотите, например, валидация или предоставить только получателя для изменяемого элемента, а затем использовать явные getters/seters, а не раньше. –

+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

Ну это в основном говорит о инкапсуляции. Согласно объекту World, Вы должны достичь состояния только посредством действия. Например, я не могу достичь 100 км/ч с моей машиной, не нажимая на ускоритель. Таким образом, скорость автомобиля 100 км/ч (состояние) достигнута только ускорение (действие).

Scala стиль добытчиками и сеттеров может дать вам немного путаницы, но тот все синтаксической путаницы (в первые дни), но Scala не делаетникакого компромисса по инкапсуляции. Вы все еще можете использовать Java стиль получения и установки, как показано ниже

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

} 

Java Bean стиль получения и установки будут генерироваться dynamically.But @BeanProperty предназначена для Java-взаимодействия. For more info

3

Для этого конкретного случая нет причин. Если это из реального проекта, это, вероятно, было скопировано из примера кем-то, кто не понимал его смысла. Вы только хотите использовать явные методы getter/setter в Scala, когда они что-то делают , другие, чем просто мутирование частной переменной.

(И как ответ Димы правильно говорит, вы должны стараться не иметь var в первую очередь.)

Смежные вопросы