给定一个或多个接口,生成类实现的最佳方法是什么?
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方法派生。理想情况下,将处理接口中的协变返回类型。实现应该通过使用私有final变量和构造函数实例来支持不可变性。应该生成equals,hashCode和toString方法。
答案 0 :(得分: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中:菜单“Source”,“Generate hashcode()和equals()......”,即。)
答案 1 :(得分:1)
在为接口实现类时,就像eclipse一样。
如果方法以get开头,则将其视为getter并解析方法以提取变量名称及其类型。为这些字段创建构造函数,并实现equals,hashcode和toString方法。
你可以进行正常的文件解析,也许反射也可以帮助不确定。
答案 2 :(得分:1)
如果您打算做得非常多,那么您可能希望考虑javac内置的注释处理器功能(在Java SE 1.5中更新)。
答案 3 :(得分:0)
除了使用现代java IDE帮助您进行样板编码之外,您还可以使用dynamic Proxy
进行检查