嗨:我有一个定义以下方法的类:
public String abstract getAnimalName();
和子类
class Ralph extends Animal
{
public String getAnimalName(){return "RALPH";}
}
我希望“Ralph”的getAnimalName是静态的,因为只有一个是无状态的 拉尔夫名字的版本。
因此,我想静态地实现getAnimalName,同时仍然满足接口。这可能吗 ?也许,有没有办法可以使用依赖注入或AOP技术通过在运行时代理静态实现来提供对象实现?
显而易见的解决方案(使用对象范围方法包装静态方法)对我的口味来说有点泛滥。
答案 0 :(得分:4)
不,你的最后一个建议是你所能做的。
这可能是一个警告,设计中有些东西是可疑的。
拉尔夫是一个实例,因此需要遵守getAnimalName
的合同。
答案 1 :(得分:2)
你最好这样做:
class Ralph extends Animal {
private static final String NAME = "RALPH";
public String getAnimalName(){return NAME;}
}
如果您愿意,也可以公开NAME
。
答案 2 :(得分:1)
需要对设计进行必要的审核。如果您对架构感到满意,我会将该类转换为单例并使用Ralph.getInstance()。getAnimalName()。
或许可以考虑注释?
@Name("RALPH")
class Ralph extends Animal
{}
您可以从Class对象中提取注释:http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getAnnotations()
答案 3 :(得分:0)
为什么不将代码更改为下一个方式:
class Ralph extends Animal
{
public static String NAME = "RALPH";
}
class Animal {
public static String NAME;
}
不仅仅是使用 getAnimalName()方法。
答案 4 :(得分:0)
实际上并不存在多个方法实例的概念。当您创建多个Ralph
对象时,它不会添加任何额外的内存。
但是,您可能想要创建元类型。