我在我的应用程序的抽象类(姑且称之为BaseRule
)。 BaseRule
实现Comparable
接口,并包含一个抽象方法签名public abstract int getExecOrder()
。
内BaseRule
实现在compareTo()
类的BaseRule
方法,getExecOrder()
的返回值被用来比较的对象。
目前我有BaseRule
类的3个具体实施方案中,其中的每一个实施getExecOrder()
方法
具有BaseRule
类实现Comparable
接口的最终目的是BaseRule
对象的集合被传递到需要这些对象进行排序,以确保他们以正确的顺序执行的程序。
在这种情况下,执行顺序仅事项在类级别,这意味着在执行任何BaseRuleA
之前每BaseRuleB
必须执行,但是每个BaseRuleB
是有效地“等于”到每个其它BaseRuleB
,使那些BaseRuleB
对象被处理的顺序不物
我的问题是,是否有更好的方式来处理这些比较的对象,而不是使用(我想出了)一个getExecOrder()
方法?
现在,我只有BaseRule
的3个具体实现,因此是很容易,只是分配的1,2,3返回值这些getExecOrder()
方法调用,但如果另一个开发人员增加了一个新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米的空间来放置这些的之间的未来实现。
也许还添加它使用反射来检查没有两个实现共享相同的优先级单元测试。
老实说,我认为你的建议的实施是去了解这一点的最好办法。无疑增加了一些评论抽象getExecOrder()
使未来的开发人员确切地知道他们的执行是应该做的。