Programing

유틸리티 클래스는 정적이어야합니까?

lottogame 2020. 11. 1. 17:13
반응형

유틸리티 클래스는 정적이어야합니까?


유틸리티 클래스 (예 : ByteUtils 또는 StreamUtils 또는 StringUtils)를 디자인해야하는 경우 가장 적합한 디자인 선택은 무엇입니까?

  • 정적 클래스 여야합니까 (저장할 상태가 없기 때문에)
  • 비 정적 클래스 (객체가 사용되지 않는 경우 gc'd) 여야합니다.

추신 : 정적 클래스 란 정적 메서드가있는 클래스 (내부 정적 클래스가 아님)를 의미했습니다.

이에 대한 디자인 선택에 대한 조언을 주시겠습니까?


범용 유틸리티 인 경우 정적이 IMO가 더 좋습니다. 저장할 상태가 없다고 말 했으므로 비 정적 상태로 만들어야하는 이유를 모르겠습니다. 정적으로 선언하면 메모리도 절약됩니다.


내 유틸리티 클래스는 다음과 같습니다.

// final, because it's not supposed to be subclassed
public final class FooUtil {

    // private constructor to avoid unnecessary instantiation of the class
    private FooUtil() {
    }

    public static int doSomethingUseful() {
    }

    // ...
}

이로 인해 유틸리티 메서드를 쉽게 테스트 할 수 있고 외부에서 쉽게 액세스 할 수 있지만 이러한 유틸리티 메서드를 모방하기가 쉽지 않기 때문에이를 사용하는 클래스를 단위 테스트하기가 어렵습니다. 그러한 유틸리티 클래스가 너무 많으면 OO 디자인 (절차 적 프로그래밍)이 부족하다는 신호일 수 있으며 실제로 코드를 테스트하기 어렵게 만들 수 있습니다.

의존성 주입 프레임 워크 (Spring, Guice 등)를 사용하는 경우 비 정적 메서드를 사용하여 유틸리티 클래스를 인스턴스화 가능하게 만들고 주입 가능한 싱글 톤으로 만드는 것이 좋습니다. 이런 식으로 이러한 유틸리티 메서드를 사용하는 클래스는 유틸리티 개체를 모의하여 테스트 할 수 있습니다.


무언가가 정적 일 수 있다고해서 정적이어야한다는 의미는 아닙니다.

이 모든 것에 대한 또 다른 고려 사항이 있습니다. 조롱입니다. 클래스 인스턴스의 동작을 모의하는 것보다 테스트에서 정적 메서드를 모의하는 것이 더 어렵습니다.

불필요한 힙 할당과 객체의 GCing에 대해 이야기하면 조기 최적화가 필요합니다. JVM은 이러한 종류의 문제를 최적화하는 데 꽤 잘할 것입니다.


유틸리티 클래스를 정의하는 가장 간단한 방법은 인스턴스가없는 열거 형입니다.

public enum Utility {;
     public static int utilityMethod(int x) { /* ... */ }
}

유틸리티 클래스에는 상태가 없거나 최소한의 상태가 없어야하므로 GC에 대해 걱정할 필요가 없습니다.

Builder, Factory와 같은 특정 목적을 위해 다른 상태 저장 클래스를 가질 수 있으며 원하는대로 객체를 만들고 완료하면 삭제할 수 있습니다.


private 생성자를 사용하여 클래스를 비 정적으로 만드는 것이 좋습니다.

  • 클래스를 정적으로 만들면 애플리케이션이 배포 될 때 클래스가로드되고, 비 정적이면 해당 정적 메서드 중 하나를 호출 할 때 클래스가로드됩니다.
  • 개인 생성자를 만들면 클래스 인스턴스화를 피할 수 있습니다.

일반적으로 유틸리티 클래스는 정적 메서드를 포함하고 속성은 포함하지 않습니다.이 접근 방식을 사용하면 클래스를 인스턴스화하지 않고도 메서드를 더 쉽게 사용할 수 있습니다. 도움이 되었기를 바랍니다.


정적으로 만들 수 있다면 확실히 그렇게하세요!

즉, 상태가 없으면 정적이어야합니다.


음, 저장할 상태가 없으면 GC에 아무것도 없으므로 불필요한 힙 할당과 GC를 피할 수 있도록 정적을 사용합니다.


순수 유틸리티 클래스는 일반적으로 정적이어야합니다. 잘 정의 된 입력 및 출력, 부작용 및 상태가없는 클래스가있는 경우 정의상 정적 클래스 여야합니다.

일반적으로 필요하기 전에 복잡성 (이 경우 종속성 주입)을 추가하지 마십시오.이를 수행하면 이점이 있습니다.


여기서 아무도 정적 유틸리티 메소드가 확장 가능하지 않다는 것을 언급하지 않습니다. 재정의 할 수 없습니다. OOP (특히 OOP의 가장 강력한 기능인 다형성)를 이용할 수 없습니다. 이는 코드 중복으로 이어집니다.

추신 :이 기사가 매우 유용하다는 것을 알았습니다. http://www.yegor256.com/2014/05/05/oop-alternative-to-utility-classes.html

참고 URL : https://stackoverflow.com/questions/7074713/should-a-utility-class-be-static

반응형