2

そのため、プログラムの設定を処理する際に少し問題が発生しました。これが使用される回数を考慮すると、単一の方法を使用するのが最適です。各変数のゲッターは、ファイルが大幅に大きくなる可能性があります。

(5フィールド* 200〜300クラス=多くの無駄なスペース)

サブクラスから定義された定数名でフィールドにアクセスする方法を理解しようとしています。

スーパークラスは抽象であり、リストで定義されており、私はそれに完全にアクセスできます。これは、フィールドのゲッターを入れてほしいクラスです。

私がそれを機能させたい方法は次のようになります:

import java.lang.reflect.Field;

public class Test {

    public Test() {
        final B b = new B();
        final C c = new C();
        System.out.println(b.getFoo());
        System.out.println(c.getFoo());
    }

    public static void main(String[] args) {
        new Test();
    }

    public class A {

        public String getFoo() {
            try {
                Field f = this.getClass().getField("FOO");
                f.setAccessible(true);
                return (String) f.get(null);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }

    }

    public class B extends A {

        private static final String FOO = "$HOME.DIR/lib/res/image1.png";

    }

    public class C extends A {

        private static final String FOO = "$HOME.DIR/lib/res/image2.png";

    }

}

予想通り、それはうまくいきませんでした。クラスAにはフィールド「FOO」が含まれていません。理想的には、それが機能していれば、私はそれが印刷されることを期待していたでしょう:

$ HOME.DIR / lib / res / image1.png
$ HOME.DIR / lib / res / image2.png

これが可能であると私が(これまでに)見てきた方法:

  1. 反射
  2. ゲッターの使用-避けたい
  3. 注釈の使用

注釈を使用することは、それが可能であると私が理解できる1つの方法でしたが、一般的には注釈の全体的な概念は好きではありませんが、それが唯一の方法である場合はもちろん受け入れます。

これを読んでいただきありがとうございます、うまくいけばあなたは洞察を提供することができます。

4

2 に答える 2

3

この問題を軽減するために設計を変更できる可能性があるため、より高いレベルの問題について詳しく説明してください。リフレクションを介して親クラスからサブクラスのフィールドにアクセスすることは、一般的には悪い考えのように思えます。

ただし、そうは言っても、リフレクションによってプライベートフィールドにアクセスするには、getDeclaredField代わりにを使用する必要があります。getField

例えば

public String getFoo() {
        try {
            Field f = this.getClass().getDeclaredField("FOO");
            f.setAccessible(true);
            return (String) f.get(null);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
}
于 2013-03-15T18:49:31.057 に答える
0

次のようなマップを使用できます。

import java.util.HashMap;
import java.util.Map;

public class Test 
{
    public Test() 
    {
        final B b = new B();
        final C c = new C();
        System.out.println(b.getFoo());
        System.out.println(c.getFoo());
    }

    public static void main(String[] args)
    {
        new Test();
    }
}

class A 
{
    private static final Map<String, String> values;

    static
    {
        values = new HashMap<String, String>();
    }

    public String getFoo() 
    {
        return (values.get("FOO"));
    }

    protected static void addValue(final String key,
                                  final String value)
    {
        values.put(key, value);
    }
}

class B extends A 
{
    static
    {
        addValue("FOO", "$HOME.DIR/lib/res/image1.png");
    }
}

class C extends A 
{
    static
    {
        addValue("FOO", "$HOME.DIR/lib/res/image2.png");
    }
}
于 2013-03-15T18:54:15.237 に答える