亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在抽象類中實現 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 關注
  • 152 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號