2013-10-01 62 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

相关问题