情况是我有这个界面:
interface ISymbol
{
}
和这些类:
class Letter implements ISymbol
{
}
class Number implements ISymbol
{
}
class LowerCaseLetter extends Letter
{
}
class UpperCaseLetter extends Letter
{
}
现在让我们说我有这个功能,在不同的班级。此类执行的逻辑不属于 ISymbol 类的实现:
class SymbolMonitor
{
void func(ISymbol[] symbols)
{
for (ISymbol iSymbol : symbols)
{
// If the symbol is a number
// or a lower case letter do something.
}
}
}
但我不想专门检查这两种类型,因为我可能还有其他实现类的 ISymbol 也需要相同的逻辑。
我的问题是关于首选的行动方式。我有两个解决这个问题的方法。1. 创建一个这样的:
enum SymbolType
{
NORMAL,
SPECIAL1,
SPECIAL2,
}
并添加到代码中:
interface ISymbol
{
SymbolType getType();
}
class SymbolMonitor
{
void func(ISymbol[] symbols)
{
for (ISymbol iSymbol : symbols)
{
if(iSymbol.getType().equals(SymbolType.SPECIAL1))
{
// Do special1 logic
}
if(iSymbol.getType().equals(SymbolType.SPECIAL2))
{
// Do special2 logic
}
}
}
}
我可以创建空接口并使用 instanceof 函数。
interface ISpecialSymbol1
{
}
接口 ISpecialSymbol2 {
}
类 LowerCaseLetter 扩展字母实现 ISpecialSymbol1 {
}
类号实现 ISymbol, ISpecialSymbol1 {
}
这样功能将是:
class SymbolMonitor
{
void func(ISymbol[] symbols)
{
for (ISymbol iSymbol : symbols)
{
if(iSymbol instanceof ISpecialSymbol1)
{
// Do special 1 logic.
}
if(iSymbol instanceof ISpecialSymbol2)
{
// Do special 2 logic.
}
}
}
}
我认为第二个选项要简单得多,但我是 java 新手,我完全不确定使用的正确方法是什么。