나는 유틸리티 함수로 가득 찬 클래스를 가지고있다. 그것의 인스턴스를 인스턴스화하는 것은 아무 의미가 없지만, 나는 여전히 그것의 메소드를 호출하기를 원한다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 정적 클래스? 추상?자바 : 정적 클래스?
답변
클래스를 static
으로 선언 할 필요가 없습니다. 메소드 static
을 선언하고 Java의 Math 클래스와 같이 클래스 이름에서 정상적으로 호출하십시오.
또한 생성자를 비공개로 만드는 것이 반드시 필요한 것은 아니지만 이렇게하는 것이 좋습니다. 생성자를 private으로 표시하면 다른 사용자가 클래스의 인스턴스를 만든 다음 해당 인스턴스에서 정적 메서드를 호출하지 못합니다. (이러한 호출은 단지 오해의 소지가있어, 코드의 가독성을 해칠 정확하게 자바에서 동일한 작동합니다.)
또한 개인 생성자를 만드는 것을 잊지 마십시오. – Asaph
@Asaph : 동의 함. 나는 그 대답을 조금 더했다. 감사. –
내부 클래스 내에서 정적 메서드를 원한다면 클래스도 정적이어야합니다. –
위대한 책 "Effective Java"에 따르면
항목 4 : 개인 생성자와 noninstantiability을 적용
- 클래스 추상화를 통해 인스 턴 스성을 강화하려는 시도가 작동하지 않습니다. ,
// Noninstantiable utility class
public class UtilityClass
{
// Suppress default constructor for noninstantiability
private UtilityClass() {
throw new AssertionError();
}
}
명시 적 생성자는 개인이기 때문에 그것을 : -
기본 생성자는 클래스가 개인 생성자를 포함하여, 그래서 클래스가 인스턴스화되지 할 수있는 명시 적으로 생성자가없는 경우에만 생성됩니다 수업 외부에서는 접근 할 수 없다. AssertionError는 엄격하게 요구되는 것은 아니지만 생성자가 실수로 클래스에서 호출 된 경우 보험에 들어갑니다. 어떤 상황에서도 클래스가 인스턴스화되지 않는다는 것을 보장합니다. 이 관용구는 생성자가 명시 적으로 제공되어 호출 할 수 없으므로 다소 직관력이 떨어집니다. 따라서 위에 표시된 것처럼 주석을 포함하는 것이 좋습니다.
부작용으로이 관용구는 클래스가 서브 클래 싱되지 못하게합니다. 모든 생성자는 명시 적으로 또는 암시 적으로 수퍼 클래스 생성자를 호출해야하며 하위 클래스는 호출 할 수있는 수퍼 클래스 생성자가 없습니다.
왜 'IllegalStateException','UnsupportedOperationException' 등과 같은 다른 대안보다 AssertionError를 선택하셨습니까? – Pacerier
@Pacerier [this] (http://stackoverflow.com/questions/398953/what-is-the-preferred-throwable-to-use-in-a-private-utility-class-constructor)를 참조하십시오. – bcsb1001
@ bcsb1001, 그게 우리에게 [이] 가져온다 (http://stackoverflow.com/questions/398953/what-is-the-preferred-throwable-to-use-in-a-private-utility-class-constructoror/ 399074 # comment41967347_399074). – Pacerier
정적 멤버 및 클래스는 OO에 참여하지 않으므로 악의적입니다. 악의는 아니지만 진지하게, 나는 액세스를 위해 싱글 톤 패턴을 가진 일반 클래스를 추천 할 것이다. 이 방법을 통해 어떤 상황에서도 행동을 재정의해야 할 경우 주요 재교육이 아닙니다. OO는 친구은 "개인 생성자"인수에 :-)
내 $ 0.02
싱글 톤은 악으로 간주됩니다. –
당신이 맞습니다, 나는 더 나쁜 것으로 생각됩니다 궁금해. 궁극적으로 나는 가장 이해하기 쉬운 솔루션을 연습하고 싶습니다. 정적 클래스가 최선의 방법입니다. 모든 메소드가 정적 인 경우, 개인용 ctor가있는 이유는 무엇입니까? 나에게 개인 ctor는 싱글 톤 패턴과 함께 사용됩니다. '그들'이 멤버가없는 클래스의 인스턴스를 원할 경우 ;-) –
private 생성자를 사용하여 다른 사용자가 클래스를 인스턴스화하거나 하위 클래스 화하지 못하도록합니다. 데이빗 Robles의 대답을 참조하십시오 : http://stackoverflow.com/questions/1844355/java-static-class/1844388#1844388 – rob
주석입니다 : 개발자가 바보 아니다, 어서; 그러나 그들은 게으르다. 다음 정적 메서드를 호출하는 개체를 만드는거야? 안할거야.
클래스를 오용 할 수있는 시간을 너무 많이 사용하지 마십시오. 당신의 동료들에게 약간의 신앙을 가져라. 당신이 그것을 어떻게 보호 하든지 항상 수업을 오용 할 수있는 방법이 있습니다. 오용 될 수없는 유일한 것은 완전히 쓸모없는 것입니다.당신이 java.lang.Math 유사한 유틸리티 클래스를 가지고있는 것처럼
(프로덕션 코드에서 jsut 학생 코드가 아닙니다.) object.staticMethod 저는 Joe Random Programmer의 능력을 과대 평가했다고 생각합니다! :-P – TofuBeer
- 최종 클래스와 개인 생성자 (좋은하지만 필수적이지)
- 공공 정적 메소드
는 소리.
거기에는 개인 생성자 및 정적 메서드를 사용하는 최종 클래스가 있습니다.
하지만이 테스트 용이성을 위해 무엇을, 난 당신이 방법에 의한 최고 수준의 클래스는 정적 할 수 없습니다이 문서
Static Methods are Death to Testability
- 1. 자바 정적 내부 클래스 초기화 오류
- 2. 정적 변수 초기화 자바
- 3. 정적 중첩 클래스 가시성 문제
- 4. 자바 정적 멤버 메모리 누수
- 5. C# 정적 데이터베이스 클래스?
- 6. 사전의 정적 일반 클래스
- 7. 정적 라이브러리로 클래스 재구성
- 8. 홀수 정적 클래스 문제
- 9. 정적 포인터가있는 C++ 클래스
- 10. Java Servlet 정적 클래스
- 11. 인터페이스, 정적 클래스 문제
- 12. Java 애플릿 정적 클래스
- 13. 정적 클래스 라이브러리 대체
- 14. 공유 정적 클래스 데이터
- 15. 그루비 정적 클래스
- 16. 정적 클래스 멤버의 초기화
- 17. 정적 클래스 할당
- 18. 데이터베이스 액세스를위한 정적 클래스?
- 19. ASP.NET : App_Code의 정적 클래스
- 20. iPhone의 정적 클래스
- 21. 정적 클래스 스레드가 안전합니까?
- 22. ConfigurationManager 및 정적 클래스
- 23. 정적 클래스 가용성 문제
- 24. 기본 정적 클래스
- 25. C++ 정적 전용 클래스
- 26. 정적 클래스의 비 정적 클래스 값에 액세스
- 27. 정적 클래스에서 비 정적 클래스 트리거?
- 28. 자바 공공 정적 주()
- 29. 자바 정적 인스턴스 생성자?
- 30. 정적 클래스 멤버로 선언 된 C++ 클래스
을 읽어 보시기 바랍니다 ..., 그렇게하지 않는 – Jon
제발 조심! 이유는 다음과 같습니다. http://www.yegor256.com/2014/05/05/oop-alternative-to-utility-classes.html – yegor256