有一个本身作为字段的对象是合理的吗?[已关闭]

2022-09-01 14:56:14

有一个对象本身是这样的字段,它是否合理:

class Thing {

    Thing field;

    public Thing() {
        this.field = this;
    }
}

我不是在谈论具有相同类型字段的类,而是一个使类的每个实例都具有字段的类。我刚刚在一些遗留代码中看到了这一点(这个字段从未被使用过),所以我很好奇。任何合法使用这个?


答案 1

是的,尽管这种情况很少见。这在 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);
    }

在这种情况下,可能是当前类,但是如果此集合是从现有的同步集合获取的,则互斥体可能不同。例如,如果你打电话,并且是一个将是地图而不是集合。mutexMap.values()MapsynchronizedMapmutex


另一个例子是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;

答案 2

我能想到至少一个证明这是有道理的例子。例如:

我有一个证书链,其中链中的每个链接都有对其父级的引用。在链的顶部,最后一个证书是自签名的,因此其父证书是其自身。

简而言之,这实际上取决于您正在建模的问题空间。任何绝对声称不应该这样做的说法都是由于缺乏想象力。

public class Cert {
    public Cert parent;
}

public class SelfSignedCert extends Cert {
    public SelfSignedCert() {
        this.parent = this;
    }
}