2011-08-27 7 views
4

getter 및 setter 메서드에 대해서는 여전히 혼란 스럽습니다. 나는이 코드를 가졌다.getter 및 setter 메서드에 어떤 이름을 사용해야합니까?

public class MethodsInstances { 

    public MethodsInstances(String name){ 
     girlName = name; 
    } 

    private String girlName; 

    public String getName(){ 
     return girlName; 
    } 

    public void sayName(){ 
     System.out.printf("Your first gf was %s", getName()); 

    } 
} 

"sayName"의 경우 getName()을 사용하는 대신 왜 girlName을 입력하지 않았습니까? getName()은 코드 에서처럼 girlName을 반환하기 때문에 동일합니다. 또한 메소드는 get 및 set으로 시작해야합니까, 아니면 원하는대로 지정할 수 있습니까? 초보자 코더, 댄 B

답변

2

그것은 "점점"및 방법의 "설정"변수의 과정을 캡슐화하는 일반적인 디자인 후두둑의에서

거대한 감사합니다. 기본 구현을 변경하려는 경우 더 많은 자유를 누릴 수 있습니다.

예를 들어, 어느 날 girlName 매개 변수를 개체 소녀로 변경하려고합니다. 외부 클래스에서 girlName에 직접 액세스하는 경우 모든 외부 코드를 변경해야합니다. 세터 방법으로

, 당신은 단순히 하나의 방법을 변경하고

public void setGirlname(String name) 
{ 
    girlname = new Girl(name, some_other_data); 
} 

또는 아마도 당신은 항상 대문자로 반환됩니다 확인 girlname을 만들고 싶어 할 수있다.

public String getGirlname() 
{ 
    return girlName.toUpperCase(); 
} 

따라서 코드 설계에 유연성을 부여합니다.

4

게터와 설정자의 요점은 그들이 가져 오거나 설정하는 개인용 변수에 액세스하는 데 사용된다는 것입니다. 이렇게하면 캡슐화를 제공하므로 나중에 코드를 리팩터링하거나 수정하는 것이 훨씬 쉬워집니다.

getter 대신 girlName을 사용한다고 가정 해보십시오. 그런 다음 기본값 (예 : 이전에 설정되지 않은 경우 기본 이름이 '게스트'라고 가정)을 추가하려면 getter 및 sayName 기능을 모두 수정해야합니다.

getter 및 setter가 get 및 set으로 시작해야한다는 요구 사항은 없습니다.이 멤버는 일반 멤버 함수 일뿐입니다. 그러나 그것을하는 것이 관례입니다. (특히 Java Beans을 사용하는 경우)

+0

임 종류를 호출,하지만 난 당신이 내가 좀 더 고급 물건을 감사 그래서 시작할 때를 위해 말을 기억합니다! –

+0

@ 페타, getter하지 말아야 * 단지 * 그 이름은 뭐라고 - 필드의 가치를 얻을? getter와 setter에 로직을 추가하는 것이 관습에 위배되는 것은 아닙니다 (일단 setter 외부에서 유효성을 검사해야한다고 들었을 때, "setter는 인수를 설정해야합니다"). – dantuch

+0

당신이 말하는 것이 사실이라면, 그 중 유일한 목적은 필드를 읽기 전용으로 만 만들거나 (getter 만 제공하여) 작성하거나 쓰기 전용으로 만 사용할 수있는 것입니다. 그 외 필드를 직접 사용하지 않는 이유는 무엇입니까? 나는 간단한 것들 (예 : 게으른 초기화, 기본값 등)을하는 것이 좋다고 생각했지만 전문가는 아니 었습니다. –

2

여기서 girlName은 getName()을 호출 할 필요가 없습니다. getName()이 필요한 이유는이 클래스 외부에서 이름을 가져 오려는 경우입니다. 예를 들어 새 클래스를 만든 다음 새 클래스에서 위의 클래스 객체를 만들고 해당 객체에 name (girlName의 값)을 할당하면 private 클래스이므로 girlName에 새 클래스에서 액세스 할 수 없습니다. 당신을위한 가치를 얻을 수있는 공개 방법이 필요합니다.

또한 getName 또는 setName 일 필요는 없지만이 기능을 사용하면 쉽게 이해할 수 있습니다.

+0

오, 당신이 클래스의 밖에서 방법을 사용하고 싶다면 ... 고맙습니다! –

0

이렇게하면 클래스를 검사하고 런타임에 Reflection을 사용하여 클래스를 호출 할 수 있습니다. 더 here

HTH

이보 Stoykov

2

가 먼저 약 abstraction, encapsulationOOP가 접근, 뮤 테이터, 불변성 및 데이터 액세스에 대해 이해하기 위해 반드시 읽어보아야 참조하십시오.

3

sayName()이 같은 클래스에 있기 때문에 대부분이 예제에서 변수를 직접 사용할 수 있습니다. 그것은 개인 값 (상태)를 유지하고 다른 클래스와의 상호 작용에 대한 공공 방법을 제공하는 객체 지향 프로그래밍의 원리이다

1) : 그 외에는

, 나는 getter 및 setter를 가진 3 가지 이유를 참조하십시오.

2. getters 및 setter를 사용하는 클래스는 종종 Java bean 디자인 패턴을 따릅니다. 이 패턴을 사용하면 JSP 또는 Spring과 같은 템플릿 엔진이나 표현식 언어에서 이러한 객체를 사용할 수 있습니다.

3) 경우에 따라 실제 오류를 방지합니다. 예 : 게터 만 값이 아닌 참조하여 운영 세터와 날짜 변수를 포장

public class DateHolder() { 
    public Date date; 

    public static void main(String... args) { 
     DateHolder holder = new DateHolder(); 
     holder.date = new Date(); 
     System.out.println("date in holder: "+holder.date); 
     Date outsideDateRef = holder.date; 
     outsideDateRef.setTime(1l); 
     //will be different, although we did not change anything in the holder object. 
     System.out.println("date in holder: "+holder.date); 
    } 
} 

은이를 방지 할 수 :

우리는 변수에 직접 액세스를 방지 할
public class DateHolder() { 
    private Date date; 
    public Date getDate() { 
     return (Date)this.date.clone(); 
    } 
    public void setDate(Date date) { 
     this.date = (Date) date.clone(); 
    } 

    public static void main(String... args) { 
     DateHolder holder = new DateHolder(); 
     holder.setDate(new Date()); 
     System.out.println("date in holder: "+holder.getDate()); 
     Date outsideDateRef = holder.getDate(); 
     outsideDateRef.setTime(1l); 
     //Date in holder will not have changed 
     System.out.println("date in holder: "+holder.getDate()); 
    } 
} 
1

, 변수를 private 변수로 만듭니다. 변수가 private 인 경우 다른 클래스가 해당 변수에 액세스 할 수 없습니다. 변수를 public으로 생성하면 모든 변수에 액세스 할 수 있습니다.

실제 개인 변수를 변경하려면 public getter() 또는 setter()가 필요합니다. 기본 명명 규칙은 변수의 이름을 가져 와서 get 및/또는 set 접두어로 사용한다고 말합니다.

구체적인 경우 getGirlname은 정확합니다.

우리는 지금 매우 관련이없는 있도록이 캡슐에게 초보자의

관련 문제