我的应用程序中有一个抽象类(我们称之为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个空间可在这些空间之间放置将来的实现。



也许还添加了一个单元测试,该单元测试使用反射来检查没有两个实现共享相同的优先级。

10-08 11:14