0

私はこれを手動で行うことができたので、この質問がばかげているように思えるかもしれません。しかし、私はすべてのオプションを 1 か所 (しかも 1 か所のみ) にまとめたいと思っています。

ダミー オプション クラスのフィールド名を使用して (commons-cli を使用して) プログラムで使用可能なオプションを設定し、そのクラスのインスタンスに値を割り当てることができるようにしたいと考えています。

問題は、プリミティブ型に対応するクラス オブジェクトを取得し、対応するオートボックス クラスを取得する方法がわからないことです。

これが私が働きたいコードです(そのようなメソッドgetAutoboxClassがないことを除いて)

public class PlayGame {
    private static final Options opts = new Options();

    static {
        Field[] allOpts = MCTSOptions.class.getFields();
        for (Field f : allOpts) {
            opts.addOption(new Option(f.getName(), f.getName(), !f.getType()
                    .equals(Boolean.TYPE), f.getName()));
        }
    }

    public static void main(String[] args) throws IOException, ParseException,
            IllegalArgumentException, IllegalAccessException,
            InvocationTargetException, SecurityException, NoSuchMethodException {
        BasicParser bp = new BasicParser();
        CommandLine cl = bp.parse(opts, args);
        String[] remainArgs = cl.getArgs();

        MCTSOptions params = new MCTSOptions();
        for (Field f : MCTSOptions.class.getFields()) {
            String name = f.getName();
                if (f.getType().equals(Boolean.TYPE)) {
                    f.set(params, true);
                } else if (f.getType().equals(String.class)) {
                    f.set(params, cl.getOptionValue(name));
                } else {
                    String value = cl.getOptionValue(name);
                    Method m = f.getType().getAutoboxClass()
                            .getMethod("valueOf", String.class);
                    f.set(params, m.invoke(null, value));
                }
            }
        }
        //...
    }
}

MCTSOptions は次のようになります。

public class MCTSOptions {
    public boolean searchOnSample = false;
    public double winOnlyMult = 0.5;
    public double firstExplorationConstant = 2;
    public double nextLearningRate = 0.1;
    public double nextExplorationConstant = 2;
    public boolean firstUsesSqrt = false;
    public boolean nextUsesSqrt = false;
    public long timeGiven = 5000L;
    public long seed = 1L;
}

(現在は long と double のみですが、将来的には他のタイプを追加する可能性があります)

4

2 に答える 2

1

それを行う組み込みの方法はありません。

そのため、たとえば、Guava はこのタスクのためのヘルパー メソッドを提供しています。内部的には、プリミティブとラッパーの間の単純なマッピングとして実装されています。

于 2013-04-09T20:13:25.360 に答える
1

プリミティブの代わりにオブジェクト (Boolean、Long など) を使用しないのはなぜですか?

于 2013-04-09T19:56:55.507 に答える