我的应用程序中有一个抽象类(我们称之为BaseRule
)。BaseRule
实现Comparable
接口,并包含抽象方法签名public abstract int getExecOrder()
。
在BaseRule
类中compareTo()
方法的BaseRule
实现中,getExecOrder()
的返回值用于比较对象。
当前,我有3个BaseRule
类的具体实现,每个实现getExecOrder()
方法
使BaseRule
类实现Comparable
接口的最终目的是将BaseRule
对象的集合传递给实用程序,该实用程序需要对这些对象进行排序以确保它们以正确的顺序执行。
在这种情况下,执行顺序仅在类级别上有意义,这意味着必须在执行任何BaseRuleA
之前执行每个BaseRuleB
,但是每个BaseRuleB
实际上都与其他BaseRuleB
相等,因此该顺序那些BaseRuleB
对象被处理并不重要
我的问题是,有没有比使用(我想出的)getExecOrder()
方法更好的方法来比较这些对象?
现在,我只有3个BaseRule
的具体实现,因此为这些getExecOrder()
方法调用分配返回值1,2,3很容易,但是如果另一个开发人员添加了新的BaseRule
实现,它们将必须扫描所有现有的实现,并(可能)更新所有类中的那些返回值以适应新的BaseRule
。
有更好的实施方案吗?
最佳答案
我猜您在谈论以下问题?
abstract class BaseRule implements Comparable<BaseRule>
{
abstract int executionPrecedence();
@Override
public int compareTo(final BaseRule that)
{
return Integer.compare(this.executionPrecedence(), that.executionPrecedence());
}
}
class RuleA extends BaseRule
{
@Override
int executionPrecedence() { return 0; }
}
class RuleB extends BaseRule
{
@Override
int executionPrecedence() { return 1; }
}
看来还算合理。如果您担心将来必须更改现有类的值,则只需留下很大的空白,而不要使用连续的整数。
A = 10000
B = 20000
C = 30000
现在,您有9999个空间可在这些空间之间放置将来的实现。
也许还添加了一个单元测试,该单元测试使用反射来检查没有两个实现共享相同的优先级。