有一个本身作为字段的对象是合理的吗?[已关闭]
有一个对象本身是这样的字段,它是否合理:
class Thing {
Thing field;
public Thing() {
this.field = this;
}
}
我不是在谈论具有相同类型字段的类,而是一个使类的每个实例都具有字段的类。我刚刚在一些遗留代码中看到了这一点(这个字段从未被使用过),所以我很好奇。任何合法使用这个?
有一个对象本身是这样的字段,它是否合理:
class Thing {
Thing field;
public Thing() {
this.field = this;
}
}
我不是在谈论具有相同类型字段的类,而是一个使类的每个实例都具有字段的类。我刚刚在一些遗留代码中看到了这一点(这个字段从未被使用过),所以我很好奇。任何合法使用这个?
是的,尽管这种情况很少见。这在 JDK 中用于字段可能是但可能不是的情况。this
从实现的类Collections.synchronizedCollection(c)
static class SynchronizedCollection<E> implements Collection<E>, Serializable {
private static final long serialVersionUID = 3053995032091335093L;
final Collection<E> c; // Backing Collection
final Object mutex; // Object on which to synchronize
SynchronizedCollection(Collection<E> c) {
this.c = Objects.requireNonNull(c);
mutex = this;
}
SynchronizedCollection(Collection<E> c, Object mutex) {
this.c = Objects.requireNonNull(c);
this.mutex = Objects.requireNonNull(mutex);
}
在这种情况下,可能是当前类,但是如果此集合是从现有的同步集合获取的,则互斥体可能不同。例如,如果你打电话,并且是一个将是地图而不是集合。mutex
Map.values()
Map
synchronizedMap
mutex
另一个例子是Storeable,默认情况下,它指向自身作为原因。
/**
* The throwable that caused this throwable to get thrown, or null if this
* throwable was not caused by another throwable, or if the causative
* throwable is unknown. If this field is equal to this throwable itself,
* it indicates that the cause of this throwable has not yet been
* initialized.
*
* @serial
* @since 1.4
*/
private Throwable cause = this;
我能想到至少一个证明这是有道理的例子。例如:
我有一个证书链,其中链中的每个链接都有对其父级的引用。在链的顶部,最后一个证书是自签名的,因此其父证书是其自身。
简而言之,这实际上取决于您正在建模的问题空间。任何绝对声称不应该这样做的说法都是由于缺乏想象力。
public class Cert {
public Cert parent;
}
public class SelfSignedCert extends Cert {
public SelfSignedCert() {
this.parent = this;
}
}