5

与大多数 Singleton 类一样,是否有一种标准技术可以使用私有构造函数“扩展”类?具体来说,我正在尝试扩展java.lang.management.ThreadInfo该类,因为我将它们中的很多添加到 aHashSet以控制唯一性。但是,我确定两个线程是否相等的方式是不同的,并且与该equals()方法的默认实现不同。

在这种情况下,扩展类显然不是一种选择。

制作类似包装类的东西是否合理,它ThreadInfo在构造函数中接受 a 然后用值手动填充所有相关字段,然后覆盖equals()and 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 标准库中不存在带有自定义比较器的 Set 实现。我想我可以编写自己的哈希集实现,但对于一个简单的情况来说工作量太大了。任何见解都会有所帮助。

4

2 回答 2

2

通过扩展,您的意思是如何创建派生类,这些派生类使用私有构造函数作为它们的超类构造函数。你不能,他们被设为私有以防止你这样做。由于 JRE 类是由有能力的程序员编写的,因此有充分的理由。因此,即使您可以使用诸如反射或字节码操作之类的技巧来解决它,您也不应该这样做。

但一切都没有丢失。无论如何,您应该更喜欢组合而不是继承。Decorator 和 Proxy 设计模式可能很有用(您的示例接近这些)。

于 2013-10-01T07:34:11.450 回答
1

鉴于几乎没有其他选择,我认为您正在做的事情是合理的。

另一种方法可能是编写您自己的 HashMap 子类,使用您的“特殊”等于而不是默认值。(可能已经有 apache 或 guava 实现来做到这一点——有人知道吗?)

(稍后添加)

因为我很懒,而且因为 ThreadInfo 有所有的 getter,所以公开它是相当“安全”的,我很想使包装类非常简单,没有 getter 和 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 的信息。

于 2013-10-01T02:51:23.577 回答