在工作中,我们对代码进行同行评审,我发现了一些我不喜欢的东西,我想询问这个特定问题的最佳实践。
我们有一个界面:
public interface Item {
public String getType();
//some other methods
}
和一个实现类:
public class EmailItem implements Item {
public static final String TYPE = "email";
@Override
public String getType() {
return TYPE;
}
}
以及一些使用这些类的代码:
for (Item item : items) {
if (EmailItem.TYPE.equals(item.getType())) {
isProcessed = Processor.process(item);
} else {
LOGGER.error("Unknown failover type received to process. Type: {}", item.getType());
}
}
此时我们只有一个实现类,因此不需要检查类型,但我们将添加一些其他实现,这样就有意义了(尽管将使用 switch
)。
主要问题是 EmailItem
将变量 TYPE
设置为公共(public),并且该变量还有一个 getter。
该类的类和实例都应该有权访问此变量,但是将其设置为 public static final 并直接使用实例访问它似乎并不正确/最佳实践(尽管在技术上这是可行的) )并且当它是私有(private)的(理应如此)时,它将无法从其他类访问(其中 for
循环是并且 static 在此时没有意义)。
通过讨论,我们提出了使用 instanceOf(...)
或 instance.getClass().getName()
和 EmailItem.class 的解决方案.getName()
但对我来说它们都不优雅:)。
最后,我的问题是针对所描述的问题最优雅的解决方案是什么?
呵呵,这是我的第一个问题,我希望它对你有意义;)。
最佳答案
从面向对象的角度考虑,我会考虑以下方法:
public interface Item {
public boolean process();
//some other methods
}
public class EmailItem implements Item {
@Override
public boolean process() {
// email specific implementation
}
}
public class AnotherItem implements Item {
@Override
public boolean process() {
// another implementation
}
}
for (Item item : items) {
isProcessed = item.process();
}
关于java - 带 getter 的公共(public)静态最终变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28364691/