2011-11-03 3 views
4

이 질문은 당황 스럽습니다. 직접 액세스 할 수있는 공개 속성 또는 getter가있는 개인 속성? 어느 쪽이 더 낫고/정확하고 왜?공개 속성 VS 대인 전용 속성?

+2

당신은 "필드"가 아닌 "속성"을 의미, 내 생각? – skaffman

+2

이전에 요청한 것처럼 느껴집니다. – Woot4Moo

답변

7

필드를 직접 노출하는 것은 나쁜 습관으로 간주됩니다.

필드를 비공개로 유지하고 getter 및 setter 만 노출하는 것이 좋습니다. 한 가지 장점은 getter 및 setter에 대해 서로 다른 액세스 수준을 선택할 수 있지만 필드에는 단일 액세스 수준 만 선택할 수 있다는 점입니다. getter를 사용하는 또 다른 이점은 클래스 인터페이스를 변경하지 않고도 구현을 변경할 수 있다는 것입니다.

가능한 경우 getter 및 setter를 피하는 것이 좋습니다. 대신 높은 수준의 동작을 캡슐화하는 메서드를 사용하십시오. 이는 객체가 다른 객체의 내부 상태 (직접 필드에 액세스하거나 getter 및 setter를 통해 간접적으로 액세스)를 변경하지 않아야하기 때문입니다. 개체를 수정하는 분야 민간 방지를 다른 클래스를 유지

관련

+4

"이유"가 없습니다. – delnan

+0

링크를 제공해 주셔서 감사합니다! – Pouya

0

, 아이가 부모의 필드를 조작 할 수있는 상속 모델의 생각합니다.

1

일반적으로 필드를 비공개로 설정하고 getter를 노출하면 호출자가 필드를 수정할 수 없으며 나중에 인터페이스를 변경하지 않고 구현을 변경할 수 있으므로 공용 필드 대신 getter를 사용하는 것이 좋습니다.

이 규칙의 예외 중 하나는 논리적 상수입니다. 사람들은 일반적으로 public static final 필드 인 Days.SATURDAY 대신에 을 선호합니다. 그러나 값이 클래스가 아닌 특정 인스턴스에 연결되거나 항상 변경 될 수 있거나 일반적으로 이와 같은 느낌이 들지 않는 경우 이 보편 상수 여야합니다. 개인 필드/공용 게터에서 제공하는 유연성이 바람직합니다.

3

게터 (및 설정자)를 사용하는 사적 속성은 공개 선언 이후 적절한 스타일로 간주되며이를 사용하면 캡슐화의 원칙에 직접적인 해를 끼칩니다. 원인이 될 수있는 문제 중 하나는 필드의 구현 유형에 직접 의존하므로 필요할 때 나중에 변경하기가 더 어렵습니다.

게다가 getters/setters를 사용하면 액세스 및 변경 과정에 논리를 추가 할 수 있습니다. 경계 체크를 수행하고 유효성을 검사하여 기본값을 null로 대체 할 수 있습니다 ...

또한 대부분의 JavaBeans 사용법과 마찬가지로 getters/setter는 직접 액세스로 수행하는 것 이상을 수행하지 않습니다. 그래서이 모든 것은 JavaBeans 문맥에서 논쟁 거리가되었습니다.

의견? 전체 내용은 심각하게 과장되어 있으며, 토론의 양이 충분한 속성과 함께 완전히 새로운 Java 언어 스펙을 작성하기에 충분한 시간과 키보드 스트로크를 먹었습니다. 교리에 귀를 기울이지 말고, 가장 잘 맞는 것은 무엇인지 생각하고 결코 이해하지 못하는 것에 대해 생각하지 마십시오. 모두가 방금 위에서 언급 한 단어를 수락하면 우리는 여전히 어셈블리로 코딩하고있을 것입니다.

+0

동의합니다. 클래스/인터페이스를 비공개로 만들고 원하는 모든 작업을 수행하십시오. 이 자료를 공개 할 필요가있는 경우에만이 자료에 대해 걱정하십시오. – emory

0

필드는 항상 비공개로 선언하십시오.가정 당신은 은행 계좌를 가지고 있고 현금 그리려 : 여기

public class BankAccountWithprivateField 
{ 
    private Cash cash; 

    // ... 

    public void draw(int amount) 
    { 
     if(amount <= balance) cash.draw(amount); 
     else sentMessage("Sorry your balance is less than what you request!"); 
    } 
} 

// ... 

new BankAccountWithprivateField().draw(500); 

은 당신이 당신의 균형있는 것보다 더 많은을 그릴 수 있습니다.

public class BankAccountWithPublicField 
{ 
    public Cash cash; 

    // ... 
} 

// ... 

new BankAccountWithPublicField().cash.draw(1000000); 

그러나 여기, 당신은 1 백만 달러를 그릴 수)

+1

새로운 가비지 수집 BankAccount에 1 백만 달러의 부채를 갖고 싶지 않습니다. – Robert