programing

Java에서는 상수 클래스를 어떻게 정의합니까?

bestcode 2022. 11. 18. 21:37
반응형

Java에서는 상수 클래스를 어떻게 정의합니까?

고정 상수만 사용하는 클래스를 정의해야 한다고 가정합니다.

public static final String SOME_CONST = "SOME_VALUE";

이를 위해 선호하는 방법은 무엇입니까?

  1. 인터페이스
  2. 추상 클래스
  3. 파이널 클래스

어떤 것을 사용해야 하며 그 이유는 무엇입니까?


몇 가지 답변에 대한 설명:

Enums - enums를 사용하지 않으며, 아무것도 열거하지 않고 서로 관련이 없는 상수만 수집합니다.

인터페이스 - 인터페이스를 구현하는 클래스는 설정하지 않습니다.인터페이스를 사용하여 다음과 같은 상수를 호출합니다.ISomeInterface.SOME_CONST.

최종 클래스를 사용하고 개인 생성자를 정의하여 공용 생성자를 숨깁니다.
하기 위해 할 수 .

public final class MyValues {

  private MyValues() {
    // No need to instantiate the class, we can hide its constructor
  }

  public static final String VALUE1 = "foo";
  public static final String VALUE2 = "bar";
}

다른 클래스:

import static MyValues.*
//...

if (VALUE1.equals(variable)) {
  //...
}

설명 내용에는 다음과 같이 기재되어 있습니다.enum을 사용하지 않고, 아무것도 열거하지 않고, 단지 서로 관련이 없는 상수를 수집합니다.

상수가 서로 전혀 관련이 없는 경우 함께 수집하려는 이유는 무엇입니까?가장 가까운 클래스에 각 상수를 입력합니다.

제안사항(선호순서 내림차순):

1) 하지 마세요.실제 클래스에서 가장 관련성이 높은 상수를 만듭니다.'상수 집합' 클래스/인터페이스는 실제로 OOO 모범 사례를 따르지 않습니다.

저나 다른 사람들은 가끔 1번을 무시해요.그렇게 하려면:

2) 프라이빗 컨스트럭터와의 최종 클래스 이것은 적어도 다른 사람이 상수에 쉽게 접근할 수 있도록 상수를 확장/실장함으로써 당신의 '상수 가방'을 남용하는 것을 막을 수 있습니다.(당신이 이것을 하지 않겠다고 말한 것은 알고 있지만, 그렇다고 해서 누군가가 당신이 하지 않을 것이라는 것을 의미하지는 않습니다.

3) 인터페이스 이것은 동작합니다만, #2에서 악용에 대해 언급하고 있는 것은 제 취향이 아닙니다.

일반적으로 이것들이 상수라고 해서 정상적인 OO 원칙을 적용해서는 안 된다는 것을 의미하지는 않습니다.한 클래스 이외에는 아무도 상수에 관심을 갖지 않는 경우, 상수는 비공개이며 해당 클래스 내에 있어야 합니다.검정에만 관심이 있는 상수는 생산 코드가 아닌 검정 클래스에 있어야 합니다.상수가 여러 곳에 정의되어 있는 경우(우발적으로만 동일하지 않음) - 중복을 제거하는 refactor.기타 등등 - 당신이 원하는 방법으로 그들을 대합니다.

Joshua Bloch가 효과적인 Java에서 언급했듯이:

  • 인터페이스는 유형을 정의하는 데만 사용해야 합니다.
  • 추상 클래스는 불안정성을 방지하지 않습니다(하위 클래스로 분류할 수 있으며 하위 클래스로 설계되도록 제안할 수도 있습니다).

모든 상수가 (행성 이름과 같이) 관련 있는 경우 Enum을 사용하거나, 관련된 클래스에 상수 값을 넣거나(액세스 권한이 있는 경우), 불안정하지 않은 유틸리티 클래스를 사용할 수 있습니다(개인 기본 생성자 정의).

class SomeConstants
{
    // Prevents instanciation of myself and my subclasses
    private SomeConstants() {}

    public final static String TOTO = "toto";
    public final static Integer TEN = 10;
    //...
}

그런 다음 이미 설명한 대로 정적 가져오기를 사용하여 상수를 사용할 수 있습니다.

내가 선호하는 방법은 그것을 전혀 하지 않는 것이다.Java 5가 type safe enums를 도입했을 때 상수의 나이는 거의 사라졌다.그 이전에도 Josh Bloch는 Java 1.4(및 그 이전)에서 동작하는 (조금 더 알기 쉬운) 버전을 출판했다.

레거시 코드와의 상호 운용성이 필요하지 않는 한 이름 있는 String/integer 상수를 사용할 필요가 없습니다.

그냥 최종 수업을 이용하세요.

다른 값을 추가할 수 있는 경우 추상 클래스를 사용합니다.

인터페이스를 사용하는 것은 그다지 의미가 없습니다.인터페이스는 계약을 지정해야 합니다.몇 가지 상수 값을 선언하려고 합니다.

이런 거엔 에넘이 제일 좋지 않아?

enum에는 문제가 없습니다. Ed의 1개 에는 IIRC가 있습니다.Java (2nd Ed)enum를 구현하는 표준 옵션을 interface모든 가치를 제공합니다.

는 [Java 를 사용하는입니다.interface에 a에 final class은근히. 은근히 은근히 얻을.public static final어떤 사람들은 이렇게 주장할 것이다.interface서투른 프로그래머는 실장할 수 있지만, 서투른 프로그래머는 당신이 무엇을 하든 짜증나는 코드를 쓸 것입니다.

어떤 게 더 나아요?

public final class SomeStuff {
     private SomeStuff() {
         throw new Error();
     }
     public static final String SOME_CONST = "Some value or another, I don't know.";
}

또는 다음 중 하나를 선택합니다.

public interface SomeStuff {
     String SOME_CONST = "Some value or another, I don't know.";
}

또는 4. 상수를 가장 많이 사용하는 논리를 포함하는 클래스에 넣습니다.

...미안해, 참을 수 없어;-)

가장 은 '우리에게'입니다.enum:

public enum SomeApiConstants {;

    public static final String SOME_CONST = "SOME_VALUE";

    //may be in hierarchy
    public enum ApiMapping {;
        public static final String VERSION = "/version";
        public static final String VERSION_LIST = "/list/{type}";
    }
}

장점:

  • 클린코드
  • 개인 생성자를 정의할 필요가 없습니다.
  • 시 됩니다.java: enum types may not be instantiated
  • 복제 및 역직렬화 방지
  1. 개인 컨스트럭터의 단점 중 하나는 메서드의 존재를 테스트할 수 없다는 것입니다.

  2. 특정 도메인 유형에 적용하기에 적합한 특성 개념으로 열거하면 분산형 상수에 적용하기에 충분하지 않아 보입니다.

Enum의 개념은 "Enumeration은 밀접하게 관련된 항목 집합입니다."입니다.

  1. 상시 인터페이스의 확장/실장은 나쁜 관행입니다.직접 참조하는 대신 불변의 상수를 확장해야 하는 요건을 고려하는 것은 어렵습니다.

  2. Sonar Source와 같은 고품질 툴을 적용할 경우 개발자에게 일정한 인터페이스를 삭제하도록 강제하는 규칙이 있습니다.이는 많은 프로젝트가 일정한 인터페이스를 즐기며 "확장"되는 일은 거의 없기 때문에 곤란한 일입니다.

언급URL : https://stackoverflow.com/questions/479565/how-do-you-define-a-class-of-constants-in-java

반응형