나는 게임을 쓰고 있는데 모든 다른 키에 대한 부울을 포함하는 입력을위한 클래스가 있습니다. 메인 게임 클래스에서이 클래스의 인스턴스를 만듭니다. 불리언이 공개 되더라도 괜찮습니까? 아니면 접근 자와 액세스해야합니까?비 정적 클래스에서 공용 변수를 사용하는 것이 좋지 않습니까?
답변
대신 각 키에 대한 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
을 외부에 노출하지 않고 변경할 수 있습니다.
이것은 이 아니며 개인 취향입니다. Encapsulation 및 Interfaces은 OO 소프트웨어 엔지니어링의 필수 부분이며 기술 POV로 인터넷을 사용할 수있는 주요 설계 이유입니다.
감사합니다. 이것은 정말 좋은 방법처럼 보입니다. – user1150769
표준적인 방법은 java bean 규약을 따르는 getters/setters로 멤버 변수를 protected 또는 private로 만드는 것입니다. 이것은 다소 장황한 경향이 있지만 getters/setters/constructors/toString/hashCode/equals 메소드를 생성하는 매우 멋진 라이브러리 (www.projectlombok.org)가 있습니다.
일반적으로 getter 및 setter는 더 깔끔하고 체계적이며 읽기 쉽기 때문에 사용하는 것이 좋습니다. 이것은 다른 프로그래머가 코드를보고있는 경우에도 도움이됩니다. 나의 전망은 당신이 특정한 이유 때문에 그들을 폭로 할 필요가 없다면 당신의 변수를 항상 비공개로 만드는 것이다. 게임에서 성능이 실제로 문제가된다면 변수를 공개하는 것이 함수 호출을 줄임으로써 조금 도움이 될 것입니다.
클래스 변수를 private로 선언하고 public으로 getter 및 setter 메서드를 사용하여 액세스하는 것은 항상 좋은 프로그래밍 방법입니다. public으로 선언해야하는 경우가 아니면.
IDE를 사용하는 경우 클릭 한 번으로 클래스 변수/멤버 변수에 대한 getter 및 setter가 생성됩니다.
나쁘지는 않지만 일반적으로 encapsulate 개체의 상태를 원할 것입니다.
이것은 주로 개인적인 취향입니다. 저는 양측에서 논쟁하는 사람들을 발견 할 것이고, 그것이 흑인이 아니거나 백인이라고 말할 수는 있지만 클래스가 "얼마나 큰지"에 달려 있다고 말하고 싶습니다.
getters와 setters를 사용하는 이유는 실제 표현을 필드로 추상화하여 자유롭게 표현할 수 있도록하기위한 것입니다. 인터페이스를 변경하지 않고 파생 된 값. 그래서 정말이 클래스에 대한 인터페이스가 얼마나 귀중한 것인가에 달려 있습니다.
첫 번째 공개 인터페이스의 일부인 경우 getter 및 setter를 사용하십시오. 다른 극단에서는 단일 클래스 내에서만 사용되는 튜플과 같은 간단한 데이터 홀더 (예 : 다른 클래스로 변환되기 전에 데이터베이스 행을 매핑하는 경우)를 사용하면 필드를 사용하는 것을 주저하지 않을 것입니다. 인터페이스가 내부적으로 사용되기 때문에 인터페이스에는 실제 가치가 없습니다.
이 클래스를 사용하는 클래스/패키지는 몇 개입니까? 개인용 "로컬"클래스 인 경우 필드를 사용하는 것과 관련하여 문제가 있다고 생각하지 않으며 호출자를 변경해야하는 경우이를 업데이트해야합니다.
필드에 액세스하는 경우 final
인 경우에도이 필드에 액세스하는 것이 훨씬 쉽습니다. 이러한 유형의 객체는 종종 그렇습니다.
이제는 getter와 setter를 계속 사용하라는 말을 듣고 Java (getters/setter를 쉽게 만드는 데 도움이되고 모든 사람이 분명히 사용하도록 도와줍니다)에 있기 때문에이 스레드를 읽으면 도움이됩니다. 이들의 사용량에 약간의 균형을 추가
- 1. MediaScannerConnection.scanFile을 사용하는 것이 좋지 않습니까?
- 2. 마법의 변수를 갖는 것이 좋지 않습니까?
- 3. 데이터베이스 대신 정적 개체를 사용하는 것이 좋지 않습니까?
- 4. 배열에서 변수를 추출하는 것이 성능에 좋지 않습니까?
- 5. 다중 스레드 응용 프로그램에서 클래스 변수를 사용하는 것이 좋지 않습니까?
- 6. 제네릭 콜백을 사용하는 것이 좋지 않습니까?
- 7. 은 모델에 has_and_belongs_to_many를 사용하는 것이 좋지 않습니까?
- 8. SOAP 용 CURL을 사용하는 것이 좋지 않습니까?
- 9. 비 정적 클래스에서 정적 변수를 잠글 때도 안전합니까?
- 10. 모든 메소드가 정적 메소드가되도록 싱글 톤을 설정하는 것이 좋지 않습니까?
- 11. 지나치게 간단한 함수를 만드는 것이 좋지 않습니까?
- 12. 정적 글로벌 작업 변수를 사용하는 것이 유리합니까?
- 13. 데이터 객체에 추상 클래스를 사용하는 것이 얼마나 좋지 않습니까?
- 14. 전역 사용자 변수를 사용하는 것이 바람직하지 않습니까?
- 15. PHP가있는 IE를 확인하는 것이 좋지 않습니까?
- 16. 정적 클래스에서 비 정적 클래스 트리거?
- 17. 데이터베이스 디자인에서 사용자 이름을 기본 키로 사용하는 것이 좋지 않습니까?
- 18. 대체 저장 형식으로 NSPersistentDocument를 사용하는 것이 좋지 않습니까?
- 19. .NET에서 흐름 제어를 위해 try-catch를 사용하는 것이 "좋지"않습니까?
- 20. 두 솔루션에서 동일한 Visual Studio 프로젝트를 사용하는 것이 좋지 않습니까?
- 21. AsyncTask 내에서 runOnUiThread를 사용하는 것이 비효율적이며 좋지 않습니까?
- 22. 중첩 된 Try..catch 블록을 사용하는 것이 좋지 않습니까?
- 23. codeigniter의 뷰에서 직접 모델을 사용하는 것이 좋지 않습니까?
- 24. 왜 리눅스 프로그래밍에서 system()을 사용하는 것이 좋지 않습니까?
- 25. 이 시나리오에서 SQL Server Scalar UDF를 사용하는 것이 좋지 않습니까?
- 26. 생성자 삽입과 기본 생성자를 함께 사용하는 것이 좋지 않습니까?
- 27. 라이브러리의 파일 이름에 더하기 문자 ('+')를 사용하는 것이 좋지 않습니까?
- 28. 종속성을 설치하는 동안 IoC 컨테이너를 사용하는 것이 좋지 않습니까?
- 29. 잠금에서 비 정적 로컬 변수를 사용하는 점은 무엇입니까?
- 30. "JSON.stringify"데이터를 SharedPreferences에 저장하는 것이 좋지 않습니까?
정말로 당신이하지 않는 한 항상 개인 변수를 사용하십시오. –
@JimmyGustafsson : Why ?? getters/setter가 실제로 아무것도하지 않고 값을 가져 오거나 설정하면 왜 공개하지 않습니까? –
부울은 _about_ 키를 어떻게 표시합니까? – paislee