2013-10-01 84 views
5

是否有像大多數單例類一樣使用私有構造函數「擴展」類的標準技術?具體而言,我試圖擴展java.lang.management.ThreadInfo類,因爲我將它們中的很多添加到HashSet來控制唯一性。但是,我確定兩個線程是否相等的方式是不同的,並且與equals()方法的默認實現不同。使用私有構造函數擴展類的技巧

在這種情況下,擴展類顯然不是一種選擇。

難道是合理的,使像一個接受構造一個ThreadInfo一個包裝類,然後手動填充所有相關領域的價值觀,然後將覆蓋equals()hashCode(),還是有更好的方法來做到這一點?

像這樣的東西是什麼,我開始寫,但更好的實現將是理想的:

class ThreadInfoWrapper { 

    private ThreadInfo info; 
    ThreadInfoWrapper(ThreadInfo info) { 
     this.info = info; 
    } 

    //Populate instance variables with Thread.State, thread ID, etc.. with 
    //Getters/setters and all that other stuff 

    public boolean equals(Object o) { //Unique implementation 
    } 

    public int hashCode() { //Whatever implementation 
    } 

} 

但是,這感覺就像一個非常迂迴的方式來實現一些基本的功能。我研究了它,並且在Java標準庫中不存在具有自定義比較器的集合的實現。我想我可以編寫我自己的哈希集實現,但對於簡單的情況來說這太多了。任何見解都會有所幫助。

+0

我很確定這樣的類不能被擴展。 –

+0

@JakobWeisblat實際上,它們可以擴展,但只能由內部類來擴展,這對這種情況沒有幫助。我明白,將它們擴展到我自己的類文件中將不起作用。我正在尋找合理的替代方案,並專門查看是否有任何標準做法。搜索一下後我找不到任何東西。 – Kon

+0

然後好運。 –

回答

2

通過擴展,您的意思是如何創建派生類,它使用私有構造函數作爲它們的超類構造函數。你不能,他們被私下阻止你這樣做。由於JRE類是由合格的程序員編寫的,因此會有很好的理由。所以即使你可以使用欺騙來解決它,比如反射或字節碼操作,你也不應該這樣做。

但一切都不會丟失。無論如何,你應該更喜歡組合來繼承。裝飾器和代理設計模式可能很有用(您的示例接近這些)。

1

我認爲你在做什麼是合理的,因爲沒有其他選擇。

另一種方法可能是編寫自己的HashMap的子類,使用您的「特殊」等於而不是默認值。 (可能已經有Apache或番石榴實現這樣做? - 有人知道的副手)

(後來加入)

因爲我懶了,因爲一個ThreadInfo擁有所有干將所以這是相當「安全」揭露,我會想使包裝類非常簡單,沒有干將也沒有setter方法:

public class ThreadInfoWrapper { 

// public so an outsider can get at the wrapped ThreadInfo 
// could be private if you are sure that will never be necessary 
public final ThreadInfo threadInfo; 

public ThreadInfoWrapper(ThreadInfo threadInfo) { 
    this.threadInfo = threadInfo; 
} 

public boolean equals(Object o) { //Unique implementation 
    // refer to threadInfo.blah... 
} 

public int hashCode() { //Whatever implementation 
    // refer to threadInfo.blah... 
} 

}

但是,這取決於你使用的正是信息爲您的equals和hashCode。

+0

感謝您的迴應。當我搜索時,我發現這個答案(http://stackoverflow.com/questions/14880450/java-hashset-with-a-custom-equality-criteria)聲稱番石榴「具體拒絕」具有任何Set平等標準與'equals()'方法不兼容。 – Kon

+0

聽起來像你已經完成了你的研究。祝你好運。 – user949300

相關問題