2009-05-16 3 views
30

유틸리티 클래스 (정적 메서드가있는 클래스)와 Service 클래스 ("서비스"를 제공하는 public 메서드가있는 클래스) 사이의 Java 차이점은 무엇입니까? 예를 들어, 암호화 객체 (암호화, 해독, 해시 또는 소금 값 가져 오기 메소드 제공)는 서비스 제공 업체이지만이 기능을 CryptoUtil.encrypt (..). 나는 더 나은 "디자인"을 따르는 방법을 찾아 내려하고있다. 생각?Java 유틸리티 클래스 대 서비스

답변

19

다른 행동이 다른 서비스 개체를 사용하여 얻을 수 있습니다 ... 결과를 얻기 위해 사용 후, 쿼리를 수행하는 데 사용. 유틸리티 클래스의 정적 메서드는 스왑 아웃 할 수 없습니다. 이는 테스트, 구현 변경 및 기타 목적에 매우 유용합니다.

예를 들어, CryptoUtilencrypt 메서드가 있음을 알 수 있습니다. 서로 다른 암호화 전략, 서로 다른 메시지 수신자 등을 지원할 수있는 다양한 객체를 갖는 것이 매우 유용 할 것입니다.

7

차이점은 서비스 클래스에는 상태가있을 수 있다는 것입니다. 그리고 국가에 의하여 나는 대화 상태를 의미합니다. 개념적 주문 시스템을 고려하십시오. 이 경우 인증에 아마 전통적인 EJB 메커니즘을 적용 받겠지만 일

interface OrderSystem { 
    void login(String username, String password); 
    List<Item> search(String criteria); 
    void order(Item item); 
    void order(Item item, int quantity); 
    void update(Item item, int quantity); 
    void remove(Item item); 
    void checkout(); 
    Map<Item, Integer> getCart(); 
    void logout(); 
} 

이러한는 (하나의 예로서)를 상태 세션 빈으로 수행 할 수있다.

요점은 한 통화의 결과가 후속 통화에 영향을 준다는 대화 상태입니다. 정적 메서드를 로컬에서 실행되는 간단한 stateless 서비스로 볼 수 있습니다.

는 서비스를 포함하는 더 넓은 의미를 가지고 있지만, 존재에 한정되지 않는다 : 상태

  • ;
  • 리모컨; 그리고 구현은 (즉, 인터페이스를 통해) 의존적이다.

우수 사례 간단하게는 편리한 방법으로 정적 메서드를 사용하는 것이 좋습니다 (특히 Java의 확장 메서드가없는 경우). 서비스는 그보다 훨씬 풍부합니다.

+1

정적 변수는 정적 클래스의 상태를 유지합니다. 저는 정적 클래스를 권장하지 않습니다. 저는 단지 말하고 있습니다 ... –

+2

정적 상태에서 본 클래스의 대부분은 제가 '싱글 톤 패턴'이었음을 보여줍니다. –

+0

정적 클래스의 정적 상태는 놀라운 동시성 문제 세계로 들어가기 위해 내가 아는 최상의 방법 중 하나입니다. 그냥 '선생님 ... –

0

나는 어렵고 빠른 규칙이 없다고 생각합니다.

저는 일반적으로 매개 변수가 거의 필요없는 기능에 정적 메서드를 사용하며 단일 메서드 호출로 수행 할 수 있습니다. 예 : 기능이 많은 파라미터를 필요로하는 경우

  • 표준 표현

에 날짜를 변환 문자열의 해시 값을 계산하고, 생성되는 여러 관련 결과가있는 경우, 그것은 더 실제 작업을 수행하는 여러 가지 방법으로 생성자에서 공유 매개 변수를 허용 할 수있는 클래스를 갖는 것이 실용적입니다.

전형적인 예 : 먼저 연결 데이터베이스 연결, 다음

0

나는이 질문에 대해 이전에 어딘가에 대답했지만 서비스의 동작을 여러 서비스로 리팩터링하는 것이 매우 쉽다는 것을 발견했다. 정적 클래스.

유일한 차이점이 있다면 (그렇다고 나는 믿는다) 정적 클래스를 사용하는 것이 결코 의미가 없다.

누군가가 "언제든지이 중 하나 이상은 없을 것"이라고 말하면 언제든지 그 중 n 개의 코드를 작성할 수 있습니다.

3

정적 메서드를 재정의 할 수 없습니다. 두 가지 방법으로 서비스를 구현하고 두 가지 방법으로 전환하려는 경우 큰 문제가 될 수 있습니다. 이런 이유로, 정적 유틸리티 클래스의 사용을 "절대로"(충분히 긴 값의 "never"에 대해) "결코"하지 않을 간단한 것들로 제한하는 것은 여러 가지 방법으로 수행되어야합니다.

관련 문제