在抽象中实现 compareTo() class

Implementing compareTo() in an abstract class

我的应用程序中有一个摘要 class(我们称它为 BaseRule)。 BaseRule 实现了 Comparable 接口,并包含抽象方法签名 public abstract int getExecOrder().

BaseRulecompareTo()方法的BaseRule实现中class,getExecOrder()的return值用于比较对象。

目前我有3个BaseRuleclass的具体实现,每个实现getExecOrder()方法

BaseRule class 实现 Comparable 接口的最终目的是将 BaseRule 对象的集合传递给需要对这些对象进行排序的实用程序对象以确保它们以正确的顺序执行。

在这种情况下,执行顺序仅在 Class 级别重要,这意味着每个 BaseRuleA 必须在任何 BaseRuleB 执行之前执行,但是每个 BaseRuleB实际上 'equal' 对每个其他 BaseRuleB,因此处理这些 BaseRuleB 对象的顺序并不重要

我的问题是,有没有比使用(我想出的)getExecOrder() 方法更好的方法来比较这些对象?

现在,我只有 BaseRule 的 3 个具体实现,因此只需将 return 值 1、2、3 分配给那些 getExecOrder() 方法调用就足够容易了,但是如果另一个开发人员添加了一个新的 BaseRule 实现,他们将不得不扫描所有现有的实现,并且(可能)更新所有 class 中的那些 return 值以适应新的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; }
}

好像还算合理。如果您担心将来必须更改现有 类 的值,那么只需留下较大的间隙而不是使用连续的整数。

一=10000

B = 20000

C = 30000

现在您有 9999 个空间可以在这些空间之间放置未来的实现。


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

老实说,我认为您提出的实施方案是解决此问题的最佳方式。一定要在摘要中添加一些注释 getExecOrder() 以便未来的开发人员确切地知道他们的实现应该做什么。