java - 带 getter 的公共(public)静态最终变量

标签 java interface

在工作中,我们对代码进行同行评审,我发现了一些我不喜欢的东西,我想询问这个特定问题的最佳实践。

我们有一个界面:

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/

相关文章:

java - Selenium 应用按钮在组合框上不起作用?

java - 如何使用 ReadableByteChannel 获取文件内容并将其存储在 byteBuffer 中?

c# - 实现接口(interface)但返回返回类型的子类?

c - 如何传递 extern(C) 函数文字?

java - 检查java字符串中的^字符

java - 是否可以通过引用将变量传递给函数?

c++ - 指向组合接口(interface)的指针 - 指向实现一个接口(interface)并从另一个接口(interface)的实现扩展的类

java - 何时使用 Action 而不是 ActionListener

java - 以通用方式使用 instanceof

delphi - Spring4D中如何使用多接口(interface)类