HolderSet.java

net.minecraft.core.HolderSet

信息

  • 全限定名:net.minecraft.core.HolderSet
  • 类型:public interface
  • 包:net.minecraft.core
  • 源码路径:src/main/java/net/minecraft/core/HolderSet.java
  • 起始行号:L18
  • 继承:Iterable<Holder>
  • 职责:

    TODO

字段/常量

内部类/嵌套类型

  • net.minecraft.core.HolderSet.Direct

    • 类型: class
    • 修饰符: public static final
    • 源码定位: L70
    • 说明:

      TODO

  • net.minecraft.core.HolderSet.ListBacked

    • 类型: class
    • 修饰符: public abstract static
    • 源码定位: L124
    • 说明:

      TODO

  • net.minecraft.core.HolderSet.Named

    • 类型: class
    • 修饰符: public static
    • 源码定位: L163
    • 说明:

      TODO

构造器

方法

下面的方法块按源码顺序生成。

Stream<Holder<T>> stream() @ L19

  • 方法名:stream
  • 源码定位:L19
  • 返回类型:Stream<Holder>
  • 修饰符:package-private

参数:

说明:

TODO

int size() @ L21

  • 方法名:size
  • 源码定位:L21
  • 返回类型:int
  • 修饰符:package-private

参数:

说明:

TODO

boolean isBound() @ L23

  • 方法名:isBound
  • 源码定位:L23
  • 返回类型:boolean
  • 修饰符:package-private

参数:

说明:

TODO

Either<TagKey<T>,List<Holder<T>>> unwrap() @ L25

  • 方法名:unwrap
  • 源码定位:L25
  • 返回类型:Either<TagKey,List<Holder>>
  • 修饰符:package-private

参数:

说明:

TODO

Optional<Holder<T>> getRandomElement(RandomSource random) @ L27

  • 方法名:getRandomElement
  • 源码定位:L27
  • 返回类型:Optional<Holder>
  • 修饰符:package-private

参数:

  • random: RandomSource

说明:

TODO

Holder<T> get(int index) @ L29

  • 方法名:get
  • 源码定位:L29
  • 返回类型:Holder
  • 修饰符:package-private

参数:

  • index: int

说明:

TODO

boolean contains(Holder<T> value) @ L31

  • 方法名:contains
  • 源码定位:L31
  • 返回类型:boolean
  • 修饰符:package-private

参数:

  • value: Holder

说明:

TODO

boolean canSerializeIn(HolderOwner<T> owner) @ L33

  • 方法名:canSerializeIn
  • 源码定位:L33
  • 返回类型:boolean
  • 修饰符:package-private

参数:

  • owner: HolderOwner

说明:

TODO

Optional<TagKey<T>> unwrapKey() @ L35

  • 方法名:unwrapKey
  • 源码定位:L35
  • 返回类型:Optional<TagKey>
  • 修饰符:package-private

参数:

说明:

TODO

static <T> HolderSet.Named<T> emptyNamed(HolderOwner<T> owner, TagKey<T> key) @ L37

  • 方法名:emptyNamed
  • 源码定位:L37
  • 返回类型: HolderSet.Named
  • 修饰符:static

参数:

  • owner: HolderOwner
  • key: TagKey

说明:

TODO

static <T> HolderSet<T> empty() @ L48

  • 方法名:empty
  • 源码定位:L48
  • 返回类型: HolderSet
  • 修饰符:static

参数:

说明:

TODO

static <T> HolderSet.Direct<T> direct(Holder<T>... values) @ L52

  • 方法名:direct
  • 源码定位:L52
  • 返回类型: HolderSet.Direct
  • 修饰符:static

参数:

  • values: Holder

说明:

TODO

static <T> HolderSet.Direct<T> direct(List<?extends Holder<T>> values) @ L57

  • 方法名:direct
  • 源码定位:L57
  • 返回类型: HolderSet.Direct
  • 修饰符:static

参数:

  • values: List<?extends Holder>

说明:

TODO

static <E,T> HolderSet.Direct<T> direct(Function<E,Holder<T>> holderGetter, E... elements) @ L61

  • 方法名:direct
  • 源码定位:L61
  • 返回类型:<E,T> HolderSet.Direct
  • 修饰符:static

参数:

  • holderGetter: Function<E,Holder>
  • elements: E…

说明:

TODO

static <E,T> HolderSet.Direct<T> direct(Function<E,Holder<T>> holderGetter, Collection<E> elements) @ L66

  • 方法名:direct
  • 源码定位:L66
  • 返回类型:<E,T> HolderSet.Direct
  • 修饰符:static

参数:

  • holderGetter: Function<E,Holder>
  • elements: Collection

说明:

TODO

代码

public interface HolderSet<T> extends Iterable<Holder<T>> {
    Stream<Holder<T>> stream();
 
    int size();
 
    boolean isBound();
 
    Either<TagKey<T>, List<Holder<T>>> unwrap();
 
    Optional<Holder<T>> getRandomElement(RandomSource random);
 
    Holder<T> get(int index);
 
    boolean contains(final Holder<T> value);
 
    boolean canSerializeIn(HolderOwner<T> owner);
 
    Optional<TagKey<T>> unwrapKey();
 
    @Deprecated
    @VisibleForTesting
    static <T> HolderSet.Named<T> emptyNamed(HolderOwner<T> owner, TagKey<T> key) {
        return new HolderSet.Named<T>(owner, key) {
            @Override
            protected List<Holder<T>> contents() {
                throw new UnsupportedOperationException("Tag " + this.key() + " can't be dereferenced during construction");
            }
        };
    }
 
    static <T> HolderSet<T> empty() {
        return (HolderSet<T>)HolderSet.Direct.EMPTY;
    }
 
    @SafeVarargs
    static <T> HolderSet.Direct<T> direct(Holder<T>... values) {
        return new HolderSet.Direct<>(List.of(values));
    }
 
    static <T> HolderSet.Direct<T> direct(List<? extends Holder<T>> values) {
        return new HolderSet.Direct<>(List.copyOf(values));
    }
 
    @SafeVarargs
    static <E, T> HolderSet.Direct<T> direct(Function<E, Holder<T>> holderGetter, E... elements) {
        return direct(Stream.of(elements).map(holderGetter).toList());
    }
 
    static <E, T> HolderSet.Direct<T> direct(Function<E, Holder<T>> holderGetter, Collection<E> elements) {
        return direct(elements.stream().map(holderGetter).toList());
    }
 
    public static final class Direct<T> extends HolderSet.ListBacked<T> {
        private static final HolderSet.Direct<?> EMPTY = new HolderSet.Direct(List.of());
        private final List<Holder<T>> contents;
        private @Nullable Set<Holder<T>> contentsSet;
 
        private Direct(List<Holder<T>> contents) {
            this.contents = contents;
        }
 
        @Override
        protected List<Holder<T>> contents() {
            return this.contents;
        }
 
        @Override
        public boolean isBound() {
            return true;
        }
 
        @Override
        public Either<TagKey<T>, List<Holder<T>>> unwrap() {
            return Either.right(this.contents);
        }
 
        @Override
        public Optional<TagKey<T>> unwrapKey() {
            return Optional.empty();
        }
 
        @Override
        public boolean contains(Holder<T> value) {
            if (this.contentsSet == null) {
                this.contentsSet = Set.copyOf(this.contents);
            }
 
            return this.contentsSet.contains(value);
        }
 
        @Override
        public String toString() {
            return "DirectSet[" + this.contents + "]";
        }
 
        @Override
        public boolean equals(Object obj) {
            return this == obj ? true : obj instanceof HolderSet.Direct<?> direct && this.contents.equals(direct.contents);
        }
 
        @Override
        public int hashCode() {
            return this.contents.hashCode();
        }
    }
 
    public abstract static class ListBacked<T> implements HolderSet<T> {
        protected abstract List<Holder<T>> contents();
 
        @Override
        public int size() {
            return this.contents().size();
        }
 
        @Override
        public Spliterator<Holder<T>> spliterator() {
            return this.contents().spliterator();
        }
 
        @Override
        public Iterator<Holder<T>> iterator() {
            return this.contents().iterator();
        }
 
        @Override
        public Stream<Holder<T>> stream() {
            return this.contents().stream();
        }
 
        @Override
        public Optional<Holder<T>> getRandomElement(RandomSource random) {
            return Util.getRandomSafe(this.contents(), random);
        }
 
        @Override
        public Holder<T> get(int index) {
            return this.contents().get(index);
        }
 
        @Override
        public boolean canSerializeIn(HolderOwner<T> owner) {
            return true;
        }
    }
 
    public static class Named<T> extends HolderSet.ListBacked<T> {
        private final HolderOwner<T> owner;
        private final TagKey<T> key;
        private @Nullable List<Holder<T>> contents;
 
        Named(HolderOwner<T> owner, TagKey<T> key) {
            this.owner = owner;
            this.key = key;
        }
 
        void bind(List<Holder<T>> contents) {
            this.contents = List.copyOf(contents);
        }
 
        public TagKey<T> key() {
            return this.key;
        }
 
        @Override
        protected List<Holder<T>> contents() {
            if (this.contents == null) {
                throw new IllegalStateException("Trying to access unbound tag '" + this.key + "' from registry " + this.owner);
            } else {
                return this.contents;
            }
        }
 
        @Override
        public boolean isBound() {
            return this.contents != null;
        }
 
        @Override
        public Either<TagKey<T>, List<Holder<T>>> unwrap() {
            return Either.left(this.key);
        }
 
        @Override
        public Optional<TagKey<T>> unwrapKey() {
            return Optional.of(this.key);
        }
 
        @Override
        public boolean contains(Holder<T> value) {
            return value.is(this.key);
        }
 
        @Override
        public String toString() {
            return "NamedSet(" + this.key + ")[" + this.contents + "]";
        }
 
        @Override
        public boolean canSerializeIn(HolderOwner<T> context) {
            return this.owner.canSerializeIn(context);
        }
    }
}

引用的其他类

  • Holder

    • 引用位置: 参数/继承/返回值
  • HolderOwner

    • 引用位置: 参数
  • TagKey

    • 引用位置: 参数/返回值
  • RandomSource

    • 引用位置: 参数
  • Util

    • 引用位置: 方法调用
    • 关联成员: Util.getRandomSafe()