2016-10-15 1 views
-3

나는 기존 스칼라와 아크카 프로젝트 작업을 시작합니다. 저는 스칼라 클래스를 말합니다. 몇몇 필드는 그것들을 private으로 만들고 getter와 setter 메소드를 다른 방식으로 제공합니다. 왜 그런 식으로 공개적으로 만들 수 있겠습니까?스칼라 - 개인 멤버가 그때 왜

나는 내 프로젝트

에서 말하는 이유는이 방법 :

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- 중복 setter – pamu

+1

이것은 데이터 캡슐화라고 불리는 주요 OO 프로그래밍 원칙 중 하나입니다. https://en.wikipedia.org/wiki/Object-oriented_programming – iuriisusuk

답변

1

클래스의 데이터 멤버에 직접 액세스하고 변형하는 것은 나쁜 생각입니다. 그 이유는 변경 가능한 데이터 멤버를 private으로 선언하고 공용 getter 및 setter에 액세스하여이를 변경 (데이터 멤버)하는 좋은 방법입니다.

1) 그것의 당신은 게터

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

처럼 getter 및 setter 일부 유효성 검사를 추가 할 수 있습니다

2) 변경 가능한 상태로 액세스를 제어해야하기 때문에 좋은 방법 세터 용

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

아니요, 이것은 스칼라에서 좋은 사례는 아닙니다. http://stackoverflow.com/questions/1568091/why-use-getters-and-setters는 'var'이 이미 공용 필드가 아닌 getter/setter 메소드 쌍 (개인 필드)이므로 관련이 없습니다. . 예를 들면. 유효성 검사를 수행하거나 변경 가능한 멤버에 대해서만 getter를 제공 한 다음 이전에 getter/setters를 명시 적으로 사용하십시오. –

+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

글쎄 그것은 캡슐화에 대해 주로 이야기합니다. 개체 세계에 따르면 동작을 통해서만 상태를 달성해야합니다. 예를 들어 가속기를 누르지 않고도 내 차로 100kmph에 도달 할 수 없습니다. 따라서 자동차 속도 100kmph (주)는 가속 (동작)에 의해 에 도달합니다. getter 및 setter의

스칼라 스타일은 당신에게 약간의 혼란을주고 있지만 (초기 일 동안) 모든 구문 혼란을 먹으 렴하지만 스칼라캡슐화에 타협하지 않습니다 수 있습니다. 당신은 여전히 ​​getter 및 setter의

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

} 

자바 빈 스타일 dynamically.But @BeanProperty는 자바 상호 운용성을 위해 의미 생성 될 수 아래처럼 getter 및 setter의 자바 스타일을 사용할 수 있습니다. For more info

3

이 특별한 경우에는 이유가 없습니다. 실제 프로젝트에서 나온 것이라면, 그 점을 이해하지 못하는 사람이 예제에서 복사 한 것일 것입니다. 스칼라에서 명시적인 getter/setter 메서드를 사용하려면 private 변수를 변경하는 것보다 기타을 수행해야합니다.

(그리고 디마의 대답은 정확하게 말하는 것처럼, 당신은 처음에 var을하지 않으려 고한다.)

관련 문제