有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在抽象类中实现compareTo()

我的应用程序中有一个抽象类(我们称之为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的具体实现,所以只需将返回值1,2,3分配给那些getExecOrder()方法调用就足够简单了,但是如果另一个开发人员添加一个新的BaseRule实现,他们将不得不扫描所有现有的实现,并且(可能)更新所有类中的那些返回值以适应新的BaseRule

有没有更好的实施方案


共 (2) 个答案

  1. # 1 楼答案

    我猜你是在说下面这类事情吧

    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个空间可以在这些空间之间放置未来的实现


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

  2. # 2 楼答案

    老实说,我认为你提出的实施方案是最好的办法。一定要在摘要getExecOrder()中添加一些注释,以便未来的开发人员确切地知道其实现应该做什么