2009-04-14 83 views
3

给定一个或多个接口,生成类实现的最佳方法是什么?自动生成值对象

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方法。

回答

3

更简洁的方式是使用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中:菜单“源”,“生成hashCode()和等于()...“,即)

+0

我会尝试JCodeModel。谢谢! – parkr 2009-04-21 10:18:29

1

和eclipse一样,当为接口实现一个类时,

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

你可以做正常的文件解析或反射也可以帮助不确定。

0
除了用现代的Java IDE,可以帮助你在样板编码还可以查询使用

一个dynamic Proxy

1

如果你要那样做非常多,那么你不妨考虑建立标注处理程序的功能in到javac(回到Java SE 1.5)。