문제

일반 get/set 속성이 있는 클래스가 있는 경우 클래스 메서드 내에서 getter를 사용해야 하는 이유가 있습니까, 아니면 전용 멤버 변수만 사용해야 합니까?나는 setter(검증 논리?)에 대해 더 많은 논쟁이 있을 수 있다고 생각하지만 getter에 대해서만 궁금합니다.

예를 들어 (Java에서) 옵션 2를 사용해야 할 이유가 있나요?

public class Something
{
    private int messageId;
    public int getMessageId() { return this.messageId; }
    public void setMessage(int messageId) { this.messageId = messageId; }

    public void doSomething()
    {
        // Option 1:
        doSomethingWithMessageId(messageId);

        // Option 2:
        doSomethingWithMessageId(getMessageId());
    }
}
도움이 되었습니까?

해결책

Java 프로그래머는 일반적으로 Getter 방법을 사용하는 데 매우 일관된 경향이 있습니다. 나는 여러 언어를 프로그램하고 그것에 대해 그렇게 일관되지 않습니다.)

나는 당신만큼 오래 말할 것입니다 ~하지 않다 getter를 만들어 원시 변수를 사용해도 괜찮습니다. 사적인 변수. 당신이 getter를 만들 때, 당신은 그것 만 사용해야합니다. 개인 필드를위한 게터를 만들 때, IDE는 게터를 소개 할 때 자동으로 원시 필드 액세스를 대체 할 것을 제안합니다. getter를 사용하는 것으로 전환하는 것은 몇 가지 키 스트로크 거리 (그리고 오류를 도입 할 가능성이 없음)이므로 필요할 때까지 지연되는 경향이 있습니다.

물론, getter-injection, 일부 유형의 프록시 및 서브 클래싱 Framworks와 같은 일을 원한다면 사용자 getters가 필요합니다!

다른 팁

getters를 사용하면 실수로 변수를 수정하지 않습니다 :) 또한 Getters와 "RAW"변수를 모두 사용하면 코드가 혼란 스러울 수 있습니다.

또한 상속을 사용하고 아동 클래스에서 Getter 메소드를 재정의 한 경우 Getter 사용 방법은 제대로 작동하는 반면 원시 변수를 사용하는 방법은 그렇지 않습니다.

어디에서나 getter 메소드를 사용하고 나중에 getMessageId()의 모든 호출에 대해 코드 검색을 수행하면 모든 메소드를 찾을 수 있지만 비공개 메소드를 사용한 경우에는 일부를 놓칠 수 있습니다.

또한 setter 메서드에 도입할 논리가 있는 경우 위치를 두 개 이상 변경하는 것에 대해 걱정할 필요가 없습니다.

속성에 할당하는 값이 알려진 또는 검증 된 값인 경우 개인 변수를 직접 안전하게 사용할 수 있습니다. (아마도 어떤 특별한 상황에서는 그것이 왜 나쁜지가 분명 할 것입니다.) 당신이하는지 아닌지는 더 맛이나 스타일의 문제입니다. 충분히 간단한 경우 Getter 또는 Setter가 컴파일러에 의해 인쇄되므로 성능 문제가 아닙니다.

값이 클래스에 알려지지 않은 경우 부동산을 사용하여 부동산을 불법적 인 값으로부터 보호 할 수 있도록 설정해야합니다.

다음은 예입니다 (C#) :

public class Something {

   private string _value;

   public string Value {
      get {
         return _value;
      }
      set {
         if (value == null) throw new ArgumentNullException();
         _value = value;
      }
   }

   public Something() {
      // using a known value
      _value = "undefined";
   }

   public Something(string initValue) {
      // using an unknown value
      Value = initValue;
   }

}

Getter를 사용하면 논리/결정이 적용된 후에 가치를 얻을 수 있도록합니다. 이것은 아마도 당신의 전형적인 상황이 아니지만, 그렇다면, 당신은 이것에 대해 스스로 감사합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top