2015-01-31 2 views
2

간단한 질문이지만 이해할 수 없습니다. is 접두어명명 규칙에 따라 "has"접두사가있는 Java 부울 설정자

예 :

private boolean active; 

public boolean isActive(){...};//getter 

public boolean setActive(boolean b){...};//setter 

하지만 has 접두사로 세터을 수행하는 방법을 이해하지 못하는 우리가 hasChildren, hasAttributes에 대해 이야기 할 때, 우리가 여부에 대해 얘기

private boolean hasChildren; 

public boolean hasChildren(){...};//getter 

public boolean ?(boolean b){...}//setter 
+4

'setHasChildren'? 의미 론적으로 명확한 한 그렇게 중요하지 않습니다 ... – Dici

답변

6

귀하의 경우에 문제는 세터에 대한 적절한 이름을 찾는 것이 아닙니다. 게이 터가 관습을 따르지 않는다는 것입니다!

specificationtutorial이 매우 명확하다 :

    속성에 대한 세터는 get
  • 로 시작해야 set
  • 비 부울 속성에 대한 게터로 시작해야
  • 부울 속성에 대한 getter는 접두사 is

이어야합니다. 그리고 그것은 i입니다. 그렇지 않으면 많은 자동 (반사 기반) 도구가 더 이상 예상대로 작동하지 않기 때문에 이러한 규칙을 따르는 것이 중요합니다. Introspectors).


그래도,이 문제를 해결할 수있는 몇 가지 옵션이 있습니다. 다음, 엄밀히 말하면, 접근이 isIsParent 호출해야하지만 의견에서, 그것은,

그래서 나는 단순히 havingChildren 또는 owningChildren 같은 속성 무언가를 호출하는 게 좋을 것 ..., 재산 isParent 전화를 제안했다 isHavingChildren/ setHavingChildren 또는 isOwningChildren/ setOwningChildren과 같은 해당 접근 자 메서드를 제공하십시오.

-1

그것에 첨부 된 컬렉션이 있습니다. 아이가 좋아하는 것은,리스트 나 맵이 될 수 있습니다 만, isActive를 나타낼 때는 단일의 프로퍼티 치를 나타냅니다. setHasChildren 값을 설정할 수 있습니다. 그러나 명명 규칙은 이해의 편의를위한 것이라고 생각합니다.

0

완전히 명확하므로 setHasChildren으로 안전하게 갈 수 있습니다. 그럼에도 불구하고 어린이에 관한 더 많은 정보를 저장하고 있다면 답변이 달라질 수 있습니다.

당신이 아이들을 포함 할 필요가있는 경우 예를 들어, 만 세터가 나을 아이들이 집합으로 표현 될 것이다 :

// no hasChildren attribute 
private Collection<ChildClass> children; 
public boolean hasChildren(){ return !children.isEmpty(); }; 
// no setter 

또 다른 예를 들어, 당신은 아이의 수를 저장하는 경우 : 부울

// no hasChildren attribute 
private int childrenCount; 
public boolean hasChildren(){ return childrenCount > 0 }; 
// no setter 
0

당신이 게터의 접두사로 is을 사용할 수 있습니다, 또는 당신은 또한 접두사로 get을 사용할 수 있습니다

,
public boolean isHasChildern();//getter 
public boolean getHasChilder();//getter 
public boolean setHasChildren(boolean active);//setter 
0

hasChildren이 객체의 상태를 검사하고 있으므로 일반적으로 setter 메소드를 기대하지 않습니다.

자식 (hasChildren() == false)이없고 다음에 hasChildren을 호출 할 때 addChild (무엇이든) 다음에 true이면 true를 반환합니다.

수동으로 해당 동작을 조작하려고하면 캡슐화가 중단되고 호출 프로그램에서 Owned 객체에 대해 알고 있어야하는 Demeter의 법칙이 있지만 객체 자체의 객체 구현은 알 수 없습니다. 나는 그 말이 의미가 있기를 바랍니다.

어리석은 비유를하기 위해, 당신은 아내에게 아이가 있는지 질문 할 수 있습니다. 그리고 그녀는 자신의 상태를보고 할 것입니다. (또는 그녀가 "큰"이라고 부르기 때문에 울기 시작합니다.) 거짓이면, 임신했을 때 (물론 동의하에) 아기를 거기에 눕히면 "임신 했으니 까."

2

JavaBeans Specification (섹션 8.3.2)에 따르면 부울 필드 fooisFoo() 따라 setFoo(boolean) 있습니다.

귀하의 경우는 접근 쌍 isHasChildren()/setHasChildren() 될 것이다.

제안 사항에 따르면 필드 이름을 boolean childrenPresent;으로 바꾸는 것이 좋습니다. 이는 사양에 따라 isChildrenPresent()setChildrenPresent()으로 파생됩니다.

+0

어쩌면'isParent'. – Waldheinz

+0

@Waldheinz 좋다! 그러나 우리가 지금까지 간다면 클래스의 속성 대신 실제로'Collection children;','return children.isEmpty();'와 같이 직접적으로 설정할 필요가없는 결과가 될 수 있습니다. (대신 컬렉션에 추가 된 항목에서 온);) 귀하의 의견을 바탕으로 제안 사항을 편집했습니다. – h7r

+0

@Waldheinz 실제로, 나는 그다지 당신의 생각을 좋아하지 않습니다. '부모'는 나에게 다른 대상에 대한 참조를 나타낼 것입니다 (나무를 생각하십시오). 하지만 너무 편향된 그래프 일 수도 있습니다 :) – h7r

0

실제 코드에서와 마찬가지로 boolean이있는 경우 setHasChildren을 사용하십시오. 그게 아니라 때

private List<Child> children; 
// ... 
public boolean hasChildren() { 
    return children.size() > 0; 
} 
// ... 
public void addChild(Child c) { 
    // ... 
} 

그러나 : 속성의 종류는 일반적으로 예를 들어 간단한 부울에 의해 뒷받침되지 않는 상태를보고하고 있기 때문에 간단한 세터가없는

일반적으로 "있다" 경우는 setHasXyz입니다.