2012-01-04 42 views
0

喜范围的方法:我有定义以下方法的类:静态执行对象的Java中

public String abstract getAnimalName(); 

而且一个子类

class Ralph extends Animal 
{ 
    public String getAnimalName(){return "RALPH";} 
} 

我想“拉尔夫”的getAnimalName是静态的,因为只有一个,无状态的 版本的拉尔夫的名字。

因此,我想静态实现getAnimalName,同时仍然满足接口。这可能吗 ?也许,有没有一种方法可以使用依赖注入或AOP技术通过在运行时代理静态代码来提供对象实现?

明显的解决方案(使用对象作用域方法包装一个静态方法)对我的口味来说有一点锅炉般的平衡。

回答

4

不,你最后的建议是你所能做的。

这可能是一个警告,说明设计中存在可疑的情况。

拉尔夫是一个实例,因此需要服从getAnimalName的合同。

2

你最好这样做的:

class Ralph extends Animal { 

    private static final String NAME = "RALPH"; 

    public String getAnimalName(){return NAME;} 
} 

您还可以使公众NAME如果你想要的。

+2

因为它可以在Ralph之外访问,所以你需要它到另一个范围 - 并且我建议使NAME最终以防止修改。 – 2012-01-04 21:47:05

+0

你说得对,当然。修复了答案。 – yair 2012-01-05 07:47:09

1

设计需要进行肯定的审查。如果您对架构感到满意,我会将该类转换为单例,并使用Ralph.getInstance()。getAnimalName()。

也许考虑这个注释?

@Name("RALPH") 
class Ralph extends Animal 
{} 

你可以拉断的Class对象注释:

0

为什么你不改变你的代码到下一个方式http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getAnnotations():

class Ralph extends Animal 
{ 
    public static String NAME = "RALPH"; 
} 

class Animal { 
    public static String NAME; 

} 

超过使用getAnimalName( )方法。

+0

我认为这是危险的,我相信它隐藏而不是覆盖var? – jayunit100 2012-01-05 00:10:02

+0

您可能还想在拉尔夫决赛中取得名称。 – 2012-01-05 00:24:48

0

实际上并没有超过一个方法实例的概念。当您创建多个Ralph对象时,它不会添加任何额外的内存。

但是,您可能想要创建元类型。