자바에서 큰 정적 타입 사전을 보유하는 우아한 방법 - 너무 큰 코드를 피하는 우아한 방법

StackOverflow https://stackoverflow.com/questions/864833

문제

기본적으로 나는 레거시에 대한 금욕 인 사전을 갖고 싶습니다. #define 지침.

6000+ 정의를 포함하는 이전 헤더 파일이 있으며 플래그 매개 변수 기능으로 사용되며 이러한 정의는 한 유형의 엔티티를 표시합니다. parameter.

C에서

  GetParameter(... , T_CTITLE, ...); 

Java에서는 전화하고 싶습니다

  Connector.getParameter(Parameter.CTITLE, ...); 

매개 변수는 라이브러리에서 매개 변수를 얻는 것과 관련된 모든 논리를 캡슐화합니다.

매개 변수 인스턴스는 헤더에서 자동으로 추출되어 Java 코드로 변환되지만 문제는 매개 변수 클래스가 너무 커진다는 것입니다. code too large 컴파일 오류 (밑줄을 밑줄 : 6000 개 이상의 매개 변수가 있습니다).

그리고 IDE O가 자동 완성을 사용하고 매개 변수 개체를 SAY에 저장하는 것에 대한 많은 것을 싫어하는 아이디어를 많이 사용하는 방식 으로이 추상화를하게되어 기쁩니다. HashMap.

편집 : 매개 변수 클래스는 다음과 같은 방식으로 정의됩니다.

public Parameter{
    /** logic **/
    public static final Parameter<T> parameter1 = new Parameter<T>("NAME", "T", 0xAAB);
    ...
    public static final Parameter<T> parameter6000 = new Parameter<T>("FOO", "T", 0xZZZ);
}
도움이 되었습니까?

해결책

명백한 해킹은 큰 상속 체인으로 분할하거나 인터페이스로 더 나은 파티션을하는 것입니다 ( public static final 노이즈) 및 하나의 인터페이스를 모두 물려받습니다.

생성 코드를 더 작게 만들어 공간을 절약 할 수 있습니다. 대신에:

new Parameter<T>("NAME", "T", 0xAAB)

미니멀리스트 접근법은 다음과 같습니다.

parameter("NAME T AAB")

제한 사항에 대한 자세한 내용은 참조하십시오 섹션 4.10 JVM 사양 (2 판). 컴파일 된 코드가 어떤지 확인하려면 사용 javap -c.

다른 팁

어쩌면 나는 당신이 올바르게하고 싶은 일을 이해하지 못할 수도 있지만, 이것은 나에게 열거에 완벽한 용도처럼 보입니다. 열거에 기능을 추가 할 수 있으므로 Java 버전이 최근에 충분한 한 (1.5+) 인 한 원하는 것을 수행 할 수 있어야합니다. 그들은 또한 직렬화됩니다!

그렇습니다. 6000 목록은 크지 만 AutoComplete에서 작동합니다.

열거의 크기에 제한이 있는지는 모르겠지만 알 수 있습니다.

전:

public enum Parameter {
    NAME("Pending", "T", 0xAAB), FOO("Foo", "T", 0x1FC);

    private final String displayValue;
    private final char myChar;
    private final int someNum;

    private Parameter(String display, char c, int num) {
        this.displayValue = display;
        this.myChar = c;
        this.someNum = num;
    }

    public String getDisplayValue() {
        return displayValue;
    }

    public char getMyChar() {
        return myChar;
    }

    public int getSomeNum() {
        return someNum;
    }
}

이제 이것은 당신이 원하는 종류의 일을 할 수 있습니다. 전:

System.out.println("Hi, the value is " + Parameter.NAME.getSomeNum());

런타임 중에 변경되지 않기 때문에 (결국 #Defines Can Cant) 열거는 청구서에 맞아야합니다.

순수한 크기에 관해서는, 당신이 그것들을 약간 촉진 시키려고 시도하고, 몇 개의 열거 그룹에 넣을 수 있습니다.

이를 통해 메타 데이터 (숫자)를 연관시키고 자동 완료, == 등을 연관시킬 수 있습니다.

기본적으로 다중 인터페이스 접근 방식이가는 길이라고 생각합니다. 다음은 그 솔루션을 구조화하는 방법입니다. 매개 변수 생성자에 대한 두 번째 인수가 무엇을 의미하는지 모르겠으므로 무시했습니다.

in .../com/yourcompany/legacydefines/parameter.java :

package com.yourcompany.legacydefines;

public class Parameter<T> {
  private final String name;
  private final T val;

  private Parameter(String name, T val) {
    this.val = val;
    this.name = name;
  }

  public static <T> Parameter<T> newParameter(String name, T val) {
    return new Parameter<T>(name, val);
  }

  // then, standard getters for "name" and "val"
}

in .../com/yourcompany/legacydefines/parameters1.java :

package com.yourcompany.legacydefines;

import static com.yourcompany.legacydefines.Parameter.newParameter;

interface Parameters1 {
  public static Parameter<String> Parameter0001 = newParameter("ABC", "ABCVAL");
  // ...
  public static Parameter<Integer> Parameter0999 = newParameter("FOO", 0xABCD);
}

in .../com/yourcompany/legacydefines/parameters2.java :

package com.yourcompany.legacydefines;

import static com.yourcompany.legacydefines.Parameter.newParameter;

interface Parameters2 {
  public static Parameter<String> Parameter1001 = newParameter("DEF", "DEFVAL");
  // ...
  public static Parameter<Integer> Parameter1999 = newParameter("BAR", 0x1002);
}

(기타 등등)

in .../com/yourcompany/legacydefines/parameters.java :

package com.yourcompany.legacydefines;

interface Parameters extends Parameters1, Parameters2, Parameters3, Parameters4,
                             Parameters5, Parameters6, Parameters7 {}

그런 다음 다른 코드에서는 Parameters.parameter4562를 사용하십시오

Tom Hawtin의 게시물을 확장하여 JSON을 사용하여 구조를 인코딩하는 것을 고려하십시오.

또는 Java 코드의 매개 변수를 하드 코딩하는 대신 XML 또는 JSON 파일 (또는 속성 파일)에 넣어 생성하는 JAR 파일에 빨려 들어가는 것이 좋습니다.

나는 그것이 당신이 원하는 것이라고 생각합니다. 'T'는 유형이며 사용자가 #define 값을 캐스팅 할 필요가 없도록 제네릭을 사용하려고합니다.

public class Parameter<T> {

    public final static Parameter<String> NAME = new Parameter<String>("hello");
    // .. 5998 more declarations
    public final static Parameter<Integer> FOO = new Parameter<Integer>(0xff0b);


    private T value;
    private Parameter(T value) {
        this.value = value;
    }
    public T getValue() {
        return value;
    }   
}

매개 변수에 액세스하려면 다음과 같이 전화하십시오.

String value = Parameter.NAME.getValue();

Java 상수는 #defines 이름과 동일하고 일반은 유형을 반영하므로 값을 생성자에게만 전달하면됩니다. 코드 완료는 잘 작동합니다 :)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top