在抽象类中实现 compareTo()

我的应用程序中有一个抽象类(我们称之为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.

关于更好实施的任何想法?


HUX布斯
浏览 141回答 2
2回答

潇湘沐

我猜你说的是下面的事情?abstract class BaseRule implements Comparable<BaseRule>{&nbsp; &nbsp; abstract int executionPrecedence();&nbsp; &nbsp; @Override&nbsp; &nbsp; public int compareTo(final BaseRule that)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return Integer.compare(this.executionPrecedence(), that.executionPrecedence());&nbsp; &nbsp; }}class RuleA extends BaseRule{&nbsp; &nbsp; @Override&nbsp; &nbsp; int executionPrecedence() { return 0; }}class RuleB extends BaseRule{&nbsp; &nbsp; @Override&nbsp; &nbsp; int executionPrecedence() { return 1; }}这似乎相当合理。如果您担心将来必须更改现有类的值,那么只需留下很大的空白而不是使用连续的整数。A = 10000B = 20000C = 30000现在您有 9999 个空间可以在这些空间之间放置未来的实现。也许还可以添加一个单元测试,它使用反射来检查没有两个实现共享相同的优先级。

森栏

老实说,我认为您提出的实施是解决此问题的最佳方法。一定要在摘要中添加一些注释,getExecOrder()以便未来的开发人员确切地知道他们的实现应该做什么。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java