2010-04-20 4 views
2

Java의 클래스 메소드에서 클래스 속성에 액세스하는 가장 좋은 방법은 항상 궁금합니다.클래스 메서드에서 클래스 특성에 액세스하는 좋은 방법은 무엇입니까?

아래 3 가지 솔루션 (또는 완전히 다른 것 : P) 중 어느 것이 우수 사례인지 빠르게 알 수 있습니까?

public class Test { 

    String a; 


    public String getA(){ 
     return this.a; 
    } 

    public setA(String a){ 
     this.a = a; 
    } 

    // Using Getter 
    public void display(){ 

     // Solution 1 
     System.out.println(this.a); 

     // Solution 2 
     System.out.println(getA()); 

     // Solution 3 
     System.out.println(this.getA()); 
    } 


    // Using Setter 
    public void myMethod(String b, String c){ 

     // Solution 1 
     this.a = b + c; 

     // Solution 2 
     setA(b + c); 

     // Solution 3 
     this.setA(b + c); 
    } 
} 

답변

3

게터와 세터가하는 일에 전적으로 달려 있습니다.메소드가 Javadoc에 명시 적으로 문서화되어야하는 값을 가져오고 설정하는 것 이상의 일을 수행하면 클래스 내부에서 선택할 수있는 방법이 실제로 달라집니다. 하지만 getters/setter와 같은 순수한 Javabean이라면 정확하게 그 이름을 가진 스코프에 지역 변수가 있는지 여부에 따라 a 또는 this.a 변수로 직접 액세스해야합니다.

개인적으로 Javabean 스펙에 따라 getters와 setter를 "순수"로 유지하고 값을 설정/설정하는 것 이상의 것을하고 싶을 때마다 자체 get-setter를 추가합니다. 예 : getAndIncrement(), getAsString(), setAsInt(String)

맛의 물질. 코딩 과정에서 일관성을 유지하는 한 실제로는 아무런 해가 없습니다.

-3

getter와 setters를 사용하는 것이 좋습니다.

  • 이 그것은 일반적으로 연습

받아 그래서 다른 프로그래머가 코드를 이해 가능성이 더 높습니다.

  • 그것은

는 당신이 누군가 널 (null)로 설정을 방지하고 싶은 말은 미래에 클래스 저자 옵션을 제공합니다. 회원을 폭로하면 절대로 그렇게 할 수 없습니다. 내가 인스턴스 멤버이며, 어떤 점에서 지역 변수있는 다른 사람을 아주 명확하게하기 위해 지속적으로 this를 사용하려고 - - this 사용 여부에 관해서는

또한 실수로 그림자를 피할 수 있습니다,하지만 난이 덜 생각 중요하고 더 스타일적인 것.

또한 this.a은 클래스 멤버가 아닌 인스턴스 멤버 (인스턴스 당 하나)이며 클래스 멤버는 정적입니다. this을 사용하는 또 다른 이유는 명확합니다.

2

향후에 유효성 검사를해야하는 경우 setter/getter가 필요합니다. 변수를 가시화하면 클래스 캡슐화에 영향을 미칩니다. 이론적으로 그것은 당신의 코드가 객체 지향 적이 지 않다는 것을 의미합니다 : P, 그러나 실제로는 많은 코드 리팩토링을 할 수있는 능력을 잃습니다. 예를 들어, 인터페이스 추출. 는 그리고이 호출을 위해, 나는 그것의 중복을 생각하지만, 그건 그냥 나를 :)

+1

질문은 변수를 표시하는 것이 아니라 클래스 자체에서 멤버 변수에 액세스하는 방법, 즉 직접 액세스하거나 getter 및 setter를 사용하는 방법에 관한 것입니다. – DaveJohnston

+1

클래스 자체에서 변수에 액세스하는 가장 좋은 방법은 직접 액세스하는 것입니다. 변수에 액세스해야하고 공용 설정자/getter를 만들어 변수를 해결해야하는 경우 내부 구현이 노출됩니다! 축하해! 이제 너는 스스로를 가둬 버렸다. 외부 구조가 노출되어 있고 다른 클래스가 접근 자 방식에 의존하기 때문에 더 이상 내부 구조를 변경할 수 없습니다. – bitc

-2

나는 간단한 이유

System.out.println(getA()); 

setA(b + c); 

와 함께 갈 것입니다 당신이 원한다면 그 일반적으로 속성을 액세스하는 방법을 변경하거나 변수를 설정할 수있는 제약을 적용하면 getA 또는 setA 메소드 만 변경할 수 있습니다.

동일한 이름의 변수를 명시 적으로 구별해야하는 경우가 아니면 사용하지 않는 것이 좋습니다.

0

this.value를 반환하는 것과 관련된 로직이 더 많은 경우 클래스에서 getter와 setter를 사용합니다. 이렇게하면 중복을 피할 수 있습니다. 예 :

... 
public List<String> getList() { 

    if (this.list == null) { 
     this.list = new LinkedList<String>(); 
    } 

return this.list; 

} 

public int getListSize() { 
    return getList().size(); 
} 
... 

다른 사람들이 내 코드를 더 쉽게 읽을 수 있기 때문에 항상 "this"를 사용합니다. 값은 로컬 변수와 클래스 속성이 될 수 있지만 this.value는 클래스 속성이라는 것은 의심의 여지가 없습니다.

+0

지연로드는 클래스 자체에 대한 문제가 아니어야합니다. 그렇다면 클래스의 생성자로 로딩을 이동 시키려고합니다. – BalusC

+0

방금 ​​반환하는 것보다 더 많은 일을하는 예제 getter 함수가 필요합니다. o) 그냥 호기심에서 벗어나 : 게으른로드를 어떻게 사용합니까? 밖에서 세터가? –

+0

* 주석 : 코멘트에'@ nickname'을 사용하여 코멘트에 대한 응답을 코멘트 작성자에게 알릴 수 있습니다. * 로딩이 클래스 외부의 발신자에게만 문제가된다면, 나는 그대로 게으른 로딩을 유지하고 없앨 것입니다. 'getListSize()'. ** 클래스 내부에서 ** getList()를 호출 할 필요가 있다면, 클래스의 생성자로 로딩을 옮기고 대신 this.list를 액세스하겠습니다. – BalusC

-1

해결 방법 2 또는 3은 필드 캡슐화를 제공하기 때문에 모범 사례입니다. 예를 들어, 필드 'a'이 사용자의 우편 번호이고 애플리케이션에 항상 우편 번호를 대문자로 반환하는 새로운 요구 사항이있는 경우 어떻게됩니까? 솔루션 2 또는 3을 사용하면이 작업이 간단 해집니다. 예 :

private String postcode; 
public String getPostcode() 
{ 
    return postcode; 
} 

private String postcode; 
public String getPostcode() 
{ 
    return postcode != null? postcode.toUppercase() : null; 
} 

이되고 당신은 단지 필드에 액세스 할 어디서나 대신 한 곳에서 변경 한 것입니다. this의 추가는 순전히 자신의 개인 스타일 또는 프로젝트 표준에 달려 있습니다. 개인적으로, 나는 그것이 불필요하고 가독성의 방식으로 들어가기를 좋아하지 않지만, 다른 사람들에게는 메소드/필드의 소유자를 더 분명하게 만든다.

+0

그리고 getPostcode()를 public으로 설정하는 이유는 무엇입니까? 변수는 비공개였습니까? 자 이제 여러분은 자신과 모순되며 내부 구현을 노출함으로써 캡슐화를 깨뜨린 것입니다. – bitc

+0

충분합니다. 나는'a'가 기본값이고 공개가 아닌 OP 코드를 잘못 읽었습니다. –

-1

setA(b + c)을 사용하면 바보입니다.

게터와 세터는 인터페이스의 일부입니다. 메서드는 이미 상태에 대한 모든 액세스 권한을가집니다. 그것에 대해 솔직하십시오.

불변량이 깨질 염려가있는 경우 클래스가 너무 복잡합니다. (허용 및 리펙터)

+0

나중에 설정하는 방법을 변경해야 할 수도 있다는 것에 대해 걱정할 필요가 있습니까? 그리고 당신이 이전에했던 20 번 중 한 번에서 어떻게 끝났는지 바꾸는 것을 잊어 버리셨습니까? 변수를 설정하는 것이 "a = (stuff)"보다 복잡하면 리팩토링으로 인해 결국 setA()가 끝납니다. – cHao

+0

인터페이스와 내부 액세스의 구분이 명확하지 않습니다. setA()는 외부 세계가 볼 수있는 것이며, 임의의 기준으로 'a'와 호환 할 수 없습니다. 두 사람 모두 이름에 A를 사용했기 때문에 똑같지 않습니다. 그것이 당신이 이해하지 못하는 것입니다. 그것이 'a'라면 직접 설정하십시오. 인터페이스 속성 인 경우 THEN은 setA()를 호출합니다. 이제 원래의 대답을 다시 읽으십시오. – bitc

+0

개체의 무결성에 신경 쓰면 * 차이가 없습니다. 'a'설정이 'a'를 설정하는 것 이상을 포함하면 (예 : 설정시 다른 물건도 설정해야 함), 기분이 좋을 때마다 설정하여 문제를 묻습니다. 비록 당신이 정말로 정말로 조심스럽고 매번 올바르게 설정했다 할지라도, 처음으로 약간 다른 설정을해야한다고 결정할 때 (예를 들어 언제 어디에서 변경되었는지 로깅), 모든 장소에서 코드를 변경해야합니다. 너 스스로 설정해. "setA (x)"가 x를 설정하지 않으면 세터에 대한 더 나은 이름을 선택해야합니다. – cHao

관련 문제