2012-03-12 10 views
5

나는 게임을 쓰고 있는데 모든 다른 키에 대한 부울을 포함하는 입력을위한 클래스가 있습니다. 메인 게임 클래스에서이 클래스의 인스턴스를 만듭니다. 불리언이 공개 되더라도 괜찮습니까? 아니면 접근 자와 액세스해야합니까?비 정적 클래스에서 공용 변수를 사용하는 것이 좋지 않습니까?

+4

정말로 당신이하지 않는 한 항상 개인 변수를 사용하십시오. –

+2

@JimmyGustafsson : Why ?? getters/setter가 실제로 아무것도하지 않고 값을 가져 오거나 설정하면 왜 공개하지 않습니까? –

+0

부울은 _about_ 키를 어떻게 표시합니까? – paislee

답변

4

대신 각 키에 대한 boolean을 가진 당신이 private Map<String, Boolean> keyStates이 있다면 모든 키가 false으로 초기화와 함께, 코드를보다 읽기 쉽게 될 것이다.그런 다음 접근이 될 수 있습니다

public void setPressed(String keyName) { 
    keyStates.put(keyName, true); 
} 

public void setReleased(String keyName) { 
    keyStates.put(keyName, false); 
} 

public boolean isPressed(String keyName) { 
    return keyStates.get(keyName); 
} 

접근 방법이 아닌 공용 변수를 가지고위한 일반적인 이유는이 클래스는 회원과 상호 작용하는 클래스에서 변경하지 않고 구현을 변경할 수 있다는 것입니다. 예를 들어 위의 코드를 사용하면 키 누름을 계산하거나 기록하는 코드를 추가하거나 기본 유형 인 Map을 외부에 노출하지 않고 변경할 수 있습니다.

이것은 이 아니며 개인 취향입니다. EncapsulationInterfaces은 OO 소프트웨어 엔지니어링의 필수 부분이며 기술 POV로 인터넷을 사용할 수있는 주요 설계 이유입니다.

+0

감사합니다. 이것은 정말 좋은 방법처럼 보입니다. – user1150769

0

표준적인 방법은 java bean 규약을 따르는 getters/setters로 멤버 변수를 protected 또는 private로 만드는 것입니다. 이것은 다소 장황한 경향이 있지만 getters/setters/constructors/toString/hashCode/equals 메소드를 생성하는 매우 멋진 라이브러리 (www.projectlombok.org)가 있습니다.

2

일반적으로 getter 및 setter는 더 깔끔하고 체계적이며 읽기 쉽기 때문에 사용하는 것이 좋습니다. 이것은 다른 프로그래머가 코드를보고있는 경우에도 도움이됩니다. 나의 전망은 당신이 특정한 이유 때문에 그들을 폭로 할 필요가 없다면 당신의 변수를 항상 비공개로 만드는 것이다. 게임에서 성능이 실제로 문제가된다면 변수를 공개하는 것이 함수 호출을 줄임으로써 조금 도움이 될 것입니다.

0

클래스 변수를 private로 선언하고 public으로 getter 및 setter 메서드를 사용하여 액세스하는 것은 항상 좋은 프로그래밍 방법입니다. public으로 선언해야하는 경우가 아니면.

IDE를 사용하는 경우 클릭 한 번으로 클래스 변수/멤버 변수에 대한 getter 및 setter가 생성됩니다.

1

나쁘지는 않지만 일반적으로 encapsulate 개체의 상태를 원할 것입니다.

3

이것은 주로 개인적인 취향입니다. 저는 양측에서 논쟁하는 사람들을 발견 할 것이고, 그것이 흑인이 아니거나 백인이라고 말할 수는 있지만 클래스가 "얼마나 큰지"에 달려 있다고 말하고 싶습니다.

getters와 setters를 사용하는 이유는 실제 표현을 필드로 추상화하여 자유롭게 표현할 수 있도록하기위한 것입니다. 인터페이스를 변경하지 않고 파생 된 값. 그래서 정말이 클래스에 대한 인터페이스가 얼마나 귀중한 것인가에 달려 있습니다.

첫 번째 공개 인터페이스의 일부인 경우 getter 및 setter를 사용하십시오. 다른 극단에서는 단일 클래스 내에서만 사용되는 튜플과 같은 간단한 데이터 홀더 (예 : 다른 클래스로 변환되기 전에 데이터베이스 행을 매핑하는 경우)를 사용하면 필드를 사용하는 것을 주저하지 않을 것입니다. 인터페이스가 내부적으로 사용되기 때문에 인터페이스에는 실제 가치가 없습니다.

이 클래스를 사용하는 클래스/패키지는 몇 개입니까? 개인용 "로컬"클래스 인 경우 필드를 사용하는 것과 관련하여 문제가 있다고 생각하지 않으며 호출자를 변경해야하는 경우이를 업데이트해야합니다.

필드에 액세스하는 경우 final 인 경우에도이 필드에 액세스하는 것이 훨씬 쉽습니다. 이러한 유형의 객체는 종종 그렇습니다.

0

이제는 getter와 setter를 계속 사용하라는 말을 듣고 Java (getters/setter를 쉽게 만드는 데 도움이되고 모든 사람이 분명히 사용하도록 도와줍니다)에 있기 때문에이 스레드를 읽으면 도움이됩니다. 이들의 사용량에 약간의 균형을 추가

Getters and Setters are bad OO design?

관련 문제