为了账号安全,请及时绑定邮箱和手机立即绑定

在抽象类中实现 compareTo()

在抽象类中实现 compareTo()

HUX布斯 2022-06-08 16:49:33
我的应用程序中有一个抽象类(我们称之为BaseRule)。 BaseRule实现Comparable接口,并包含一个抽象方法签名public abstract int getExecOrder()。在类中方法的BaseRule实现中,返回值用于比较对象。compareTo()BaseRulegetExecOrder()目前我有3个BaseRule类的具体实现,每个实现getExecOrder()方法BaseRule让类实现Comparable接口的最终目的是将BaseRule对象集合传递给一个实用程序,该实用程序需要对这些对象进行排序以确保它们以正确的顺序执行。在这种情况下,执行顺序只在 Class 级别很重要,这意味着BaseRuleA必须在执行 any 之前BaseRuleB执行 every ,但是 everyBaseRuleB实际上“等于”every other BaseRuleB,因此处理这些BaseRuleB对象的顺序无关紧要我的问题是,有没有更好的方法来比较这些对象而不是使用(我想出的)getExecOrder()方法?现在,我只有 3 个具体的实现,BaseRule所以很容易将返回值 1,2,3 分配给这些getExecOrder()方法调用,但是如果另一个开发人员添加了新的BaseRule实现,他们将不得不扫描所有现有的实现,并且(可能)更新所有类中的那些返回值以适应新的BaseRule.关于更好实施的任何想法?
查看完整描述

2 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

我猜你说的是下面的事情?


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


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


查看完整回答
反对 回复 2022-06-08
?
森栏

TA贡献1810条经验 获得超5个赞

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



查看完整回答
反对 回复 2022-06-08
  • 2 回答
  • 0 关注
  • 140 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信