2009-12-04 3 views
123

나는 유틸리티 함수로 가득 찬 클래스를 가지고있다. 그것의 인스턴스를 인스턴스화하는 것은 아무 의미가 없지만, 나는 여전히 그것의 메소드를 호출하기를 원한다. 이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 정적 클래스? 추상?자바 : 정적 클래스?

+14

을 읽어 보시기 바랍니다 ..., 그렇게하지 않는 – Jon

+0

제발 조심! 이유는 다음과 같습니다. http://www.yegor256.com/2014/05/05/oop-alternative-to-utility-classes.html – yegor256

답변

153

final로 표시된 클래스의 전용 생성자 및 정적 메서드.

+17

@matt b : David Robles가 그의 답변에서 지적했듯이, 클래스를 final로 만든다. private이기 때문에 서브 클래스가 수퍼 클래스 생성자를 호출 할 수 없으므로 서브 클래 싱 할 수 없다. 그러나 ... 명시 적으로 해가되지 않습니다. 그러나 jfyi :-). – Tom

+1

@David, 왜 두 개의 답변을 게시 했습니까? http://stackoverflow.com/a/1844388/632951 – Pacerier

1

클래스를 static으로 선언 할 필요가 없습니다. 메소드 static을 선언하고 Java의 Math 클래스와 같이 클래스 이름에서 정상적으로 호출하십시오.

또한 생성자를 비공개로 만드는 것이 반드시 필요한 것은 아니지만 이렇게하는 것이 좋습니다. 생성자를 private으로 표시하면 다른 사용자가 클래스의 인스턴스를 만든 다음 해당 인스턴스에서 정적 메서드를 호출하지 못합니다. (이러한 호출은 단지 오해의 소지가있어, 코드의 가독성을 해칠 정확하게 자바에서 동일한 작동합니다.)

+1

또한 개인 생성자를 만드는 것을 잊지 마십시오. – Asaph

+0

@Asaph : 동의 함. 나는 그 대답을 조금 더했다. 감사. –

+0

내부 클래스 내에서 정적 메서드를 원한다면 클래스도 정적이어야합니다. –

90

위대한 책 "Effective Java"에 따르면

항목 4 : 개인 생성자와 noninstantiability을 적용

- 클래스 추상화를 통해 인스 턴 스성을 강화하려는 시도가 작동하지 않습니다. ,

// Noninstantiable utility class 
public class UtilityClass 
{ 
    // Suppress default constructor for noninstantiability 
    private UtilityClass() { 
     throw new AssertionError(); 
    } 
} 

명시 적 생성자는 개인이기 때문에 그것을 : -

기본 생성자는 클래스가 개인 생성자를 포함하여, 그래서 클래스가 인스턴스화되지 할 수있는 명시 적으로 생성자가없는 경우에만 생성됩니다 수업 외부에서는 접근 할 수 없다. AssertionError는 엄격하게 요구되는 것은 아니지만 생성자가 실수로 클래스에서 호출 된 경우 보험에 들어갑니다. 어떤 상황에서도 클래스가 인스턴스화되지 않는다는 것을 보장합니다. 이 관용구는 생성자가 명시 적으로 제공되어 호출 할 수 없으므로 다소 직관력이 떨어집니다. 따라서 위에 표시된 것처럼 주석을 포함하는 것이 좋습니다.

부작용으로이 관용구는 클래스가 서브 클래 싱되지 못하게합니다. 모든 생성자는 명시 적으로 또는 암시 적으로 수퍼 클래스 생성자를 호출해야하며 하위 클래스는 호출 할 수있는 수퍼 클래스 생성자가 없습니다.

+1

왜 'IllegalStateException','UnsupportedOperationException' 등과 같은 다른 대안보다 AssertionError를 선택하셨습니까? – Pacerier

+0

@Pacerier [this] (http://stackoverflow.com/questions/398953/what-is-the-preferred-throwable-to-use-in-a-private-utility-class-constructor)를 참조하십시오. – bcsb1001

+0

@ bcsb1001, 그게 우리에게 [이] 가져온다 (http://stackoverflow.com/questions/398953/what-is-the-preferred-throwable-to-use-in-a-private-utility-class-constructoror/ 399074 # comment41967347_399074). – Pacerier

6

정적 멤버 및 클래스는 OO에 참여하지 않으므로 악의적입니다. 악의는 아니지만 진지하게, 나는 액세스를 위해 싱글 톤 패턴을 가진 일반 클래스를 추천 할 것이다. 이 방법을 통해 어떤 상황에서도 행동을 재정의해야 할 경우 주요 재교육이 아닙니다. OO는 친구은 "개인 생성자"인수에 :-)

내 $ 0.02

+17

싱글 톤은 악으로 간주됩니다. –

+0

당신이 맞습니다, 나는 더 나쁜 것으로 생각됩니다 궁금해. 궁극적으로 나는 가장 이해하기 쉬운 솔루션을 연습하고 싶습니다. 정적 클래스가 최선의 방법입니다. 모든 메소드가 정적 인 경우, 개인용 ctor가있는 이유는 무엇입니까? 나에게 개인 ctor는 싱글 톤 패턴과 함께 사용됩니다. '그들'이 멤버가없는 클래스의 인스턴스를 원할 경우 ;-) –

+3

private 생성자를 사용하여 다른 사용자가 클래스를 인스턴스화하거나 하위 클래스 화하지 못하도록합니다. 데이빗 Robles의 대답을 참조하십시오 : http://stackoverflow.com/questions/1844355/java-static-class/1844388#1844388 – rob

2

주석입니다 : 개발자가 바보 아니다, 어서; 그러나 그들은 게으르다. 다음 정적 메서드를 호출하는 개체를 만드는거야? 안할거야.

클래스를 오용 할 수있는 시간을 너무 많이 사용하지 마십시오. 당신의 동료들에게 약간의 신앙을 가져라. 당신이 그것을 어떻게 보호 하든지 항상 수업을 오용 할 수있는 방법이 있습니다. 오용 될 수없는 유일한 것은 완전히 쓸모없는 것입니다.당신이 java.lang.Math 유사한 유틸리티 클래스를 가지고있는 것처럼

+7

(프로덕션 코드에서 jsut 학생 코드가 아닙니다.) object.staticMethod 저는 Joe Random Programmer의 능력을 과대 평가했다고 생각합니다! :-P – TofuBeer

2
  • 최종 클래스와 개인 생성자 (좋은하지만 필수적이지)
  • 공공 정적 메소드
20

는 소리.
거기에는 개인 생성자 및 정적 메서드를 사용하는 최종 클래스가 있습니다.

하지만이 테스트 용이성을 위해 무엇을, 난 당신이 방법에 의한 최고 수준의 클래스는 정적 할 수 없습니다이 문서
Static Methods are Death to Testability

+0

java.lang.Math "death to testability"도 마찬가지입니까? – Pacerier

+1

https://code.google.com/p/testability-explorer/에서 점수를 얻는 방법에 대해 알아 보는 것은 흥미로울 수 있습니다. – crowne