0

#define基本的に、レガシーディレクティブを抽象化した辞書が欲しいです。

私は6000以上の定義を含む古いヘッダーファイルを持っています。これらはフラグパラメータとして使用され、これらの定義はエンティティの1つのタイプを示しますparameter

Cで私は持っています

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

Javaで私は呼び出したい

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

パラメータは、ライブラリからパラメータを取得することに関連するすべてのロジックをカプセル化します。

パラメーター インスタンスはヘッダーから自動的に抽出され、Java コードに変換されますが、問題はパラメーター クラスが大きくなりすぎることです。つまり、code too largeコンパイル エラーが発生します (下線を引きましょう: 6000 以上のパラメーターがあります)。

IDE がオートコンプリートを使用できるような方法でこの抽象化を行うことができれば非常に嬉しく思います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);
}
4

5 に答える 5

4

明らかなハックは、大きな継承チェーンに分割するか、インターフェース (public static finalノイズは必要ありません) に分割し、それらすべてを継承する 1 つのインターフェースにすることです。

作成コードを小さくすることでスペースを節約できます。それ以外の:

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

最小限のアプローチは次のようになります。

parameter("NAME T AAB")

制限の詳細については、JVM 仕様 (第 2 版) のセクション 4.10を参照してください。コンパイルされたコードがどのようなものかを確認するには、 を使用します。javap -c

于 2009-05-14T18:13:06.527 に答える
1

あなたが何をしたいのか理解していないかもしれませんが、これは Enum の完璧な使い方のように思えます。Enum に関数を追加できるので、Java のバージョンが最新 (1.5+) である限り、必要なことを実行できるはずです。こちらも連載中!

はい、オートコンプリートで動作しますが、6000 のリストは大きいです。

Enum のサイズに制限があるかどうかはわかりませんが、調べることができます。

元:

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());

これらは実行時に変更されないため (結局のところ、#DEFINE では変更できません)、ENUM が適しているはずです。

純粋なサイズについては、それらをわずかに分類して、いくつかの Enum グループに入れることをお勧めします。

これにより、メタデータ (数字) を関連付けたり、オートコンプリートや == などを実行したりできます。

于 2009-05-14T18:30:15.067 に答える
1

基本的には、マルチインターフェースアプローチが進むべき道だと思います。そのソリューションをどのように構成するかを次に示します。Parameter コンストラクターの 2 番目の引数の意味がわからないため、無視しました。

.../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"
}

.../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);
}

.../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);
}

(など)

.../com/yourcompany/legacydefines/Parameters.java 内:

package com.yourcompany.legacydefines;

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

次に、他のコードで Parameters.Parameter4562 を使用するだけです

于 2009-05-14T20:47:30.493 に答える
0

それがあなたの望みだと思います。「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 名と同じで、ジェネリックは型を反映するため、値をコンストラクターに渡すだけで済みます。コード補完は正常に機能します:)

于 2009-05-14T18:54:38.347 に答える
0

Tom Hawtin の投稿を拡張して、JSON を使用して構造をエンコードすることを検討してください。

または、Java コードにパラメーターをハードコードするのではなく、XML または JSON ファイル (またはプロパティ ファイル) にパラメーターを配置し、最終的に作成する JAR ファイルに吸い込まれます。

于 2009-05-14T18:19:46.137 に答える