在一个抽象类的compareTo实现()

问题描述 投票:0回答:2

我在我的应用程序的抽象类(姑且称之为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

上更好地实施任何想法?

java sorting comparable
2个回答
3
投票

我猜你在谈论以下之类的事情?

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米的空间来放置这些的之间的未来实现。


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


1
投票

老实说,我认为你的建议的实施是去了解这一点的最好办法。无疑增加了一些评论抽象getExecOrder()使未来的开发人员确切地知道他们的执行是应该做的。

© www.soinside.com 2019 - 2024. All rights reserved.