如何在snakeyaml中使用静态方法构造?

时间:2013-12-10 15:16:31

标签: java yaml snakeyaml

我有一个带有私有构造函数的类和一个返回实例的静态方法,如下所示:

public class OptionsBean {
    public static final OPTION1 = new OptionsBean(0, "COLOR");
    public static final OPTION2 = new OptionsBean(1, "SIZE");

    private OptionsBean(int id, String name) { ... }

    public static OptionsBean valueOf(String name) {
        if (name.equals("COLOR")) {
            return OPTION1;
        } else {
            return OPTION2;
        }
    }
}

根类看起来像这样:

public class Root {
    ...
    public OptionsBean getOptions() { ... }
    public void setOptions(OptionsBean value} { ... }
    ...
}

我希望我的YAML看起来像这样:

name: Colored Box
options: COLOR
height: 100
width: 100

我知道我可以使用标签来获得我想要的东西,但我宁愿不必使用显式标签。

1 个答案:

答案 0 :(得分:0)

我似乎已经解决了我自己的问题,虽然我不知道它是多么“正确”:

private static class MyConstructor extends Constructor {

    public MyConstructor(Class<? extends Object> theRoot) {
        super(theRoot);

        this.yamlClassConstructors.put(NodeId.scalar, new ConstructCustom());
    }

    private class ConstructCustom extends ConstructScalar {

        @Override
        public Object construct(Node node) {
            if (node.getType().equals(OptionsBean.getClass())) {
                return OptionsBean.valueOf(node.getValue());
            } else {
                return super.construct(node);
            }
        }
    }
}