【问题标题】:Autogenerate value objects自动生成值对象
【发布时间】:2009-04-14 07:52:52
【问题描述】:

给定一个或多个接口,生成类实现的最佳方式是什么?

interface Vehicle
{
    Engine getEngine();
}

@Generated
class Car implements Vehicle
{
    private final Engine engine;

    public Car(Engine engine)
    {
        this.engine = engine;
    }

    public Engine getEngine()
    {
        return engine;
    }

    // generated implementation of equals, hashCode, toString, 
}

类变量应该派生自接口的getter方法。理想情况下,将处理接口中的协变返回类型。实现应该通过使用私有最终变量和构造函数实例化来支持不变性。应该生成equals、hashCode和toString方法。

【问题讨论】:

    标签: java annotations runtime code-generation compile-time


    【解决方案1】:

    更简洁的方法是使用CGLIB 在运行时动态生成类。显然,您无法浏览源文件。

    如果您需要源文件,可以尝试codemodel 并执行以下操作:

    JCodeModel cm = new JCodeModel();
    x = cm._class("foo.bar.Car");
    x.field(Engine.class, "engine");
    for (PropertyDescriptor pd:    Introspector.
                  getBeanInfo(Vehicle.class).getPropertyDescriptors()) {
        g = x.method(JMod.PUBLIC, cm.VOID, pd.getReaderMethod().getName()); 
        g.body()...
        s = x.method(JMod.PUBLIC, cm.VOID, "set" + pd.getName());
        s.body()...
    }
    hc = x.method(JMod.PUBLIC, cm.VOID, "hashCode"));
    hc.body()...
    cm.build(new File("target/generated-sources"));
    

    或者如前所述,使用 IDE(在 Eclipse 中:菜单“Source”、“Generate hashcode() and equals()...”,即)

    【讨论】:

    • 我会试试 JCodeModel。谢谢!
    【解决方案2】:

    为接口实现类时就像 eclipse 一样。

    如果方法以 get 开头,则将其视为 getter 并解析方法以提取变量名称及其类型。为这些字段创建一个构造函数,并实现 equals、hashcode 和 toString 方法。

    您可以进行正常的文件解析,或者反射也可以帮助不确定。

    【讨论】:

      【解决方案3】:

      如果您打算做很多事情,那么您可能希望考虑 javac 中内置的注释处理器功能(回到 Java SE 1.5 中)。

      【讨论】:

        【解决方案4】:

        除了使用可帮助您进行样板编码的现代 Java IDE 之外,您还可以使用 dynamic Proxy 进行检查

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-12-03
          • 2012-03-05
          相关资源
          最近更新 更多