Holder.java

net.minecraft.core.Holder

信息

  • 全限定名:net.minecraft.core.Holder
  • 类型:public interface
  • 包:net.minecraft.core
  • 源码路径:src/main/java/net/minecraft/core/Holder.java
  • 起始行号:L16
  • 职责:

    TODO

字段/常量

内部类/嵌套类型

  • net.minecraft.core.Holder.Direct

    • 类型: record
    • 修饰符: public
    • 源码定位: L58
    • 说明:

      TODO

  • net.minecraft.core.Holder.Kind

    • 类型: enum
    • 修饰符: public static
    • 源码定位: L125
    • 说明:

      TODO

  • net.minecraft.core.Holder.Reference

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

      TODO

  • net.minecraft.core.Holder.Reference.Type

    • 类型: enum
    • 修饰符: protected static
    • 源码定位: L273
    • 说明:

      TODO

构造器

方法

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

T value() @ L17

  • 方法名:value
  • 源码定位:L17
  • 返回类型:T
  • 修饰符:package-private

参数:

说明:

TODO

boolean isBound() @ L19

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

参数:

说明:

TODO

boolean areComponentsBound() @ L21

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

参数:

说明:

TODO

boolean is(Identifier key) @ L23

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

参数:

  • key: Identifier

说明:

TODO

boolean is(ResourceKey<T> key) @ L25

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

参数:

  • key: ResourceKey

说明:

TODO

boolean is(Predicate<ResourceKey<T>> predicate) @ L27

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

参数:

  • predicate: Predicate<ResourceKey>

说明:

TODO

boolean is(TagKey<T> tag) @ L29

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

参数:

  • tag: TagKey

说明:

TODO

boolean is(Holder<T> holder) @ L31

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

参数:

  • holder: Holder

说明:

TODO

Stream<TagKey<T>> tags() @ L34

  • 方法名:tags
  • 源码定位:L34
  • 返回类型:Stream<TagKey>
  • 修饰符:package-private

参数:

说明:

TODO

DataComponentMap components() @ L36

  • 方法名:components
  • 源码定位:L36
  • 返回类型:DataComponentMap
  • 修饰符:package-private

参数:

说明:

TODO

Either<ResourceKey<T>,T> unwrap() @ L38

  • 方法名:unwrap
  • 源码定位:L38
  • 返回类型:Either<ResourceKey,T>
  • 修饰符:package-private

参数:

说明:

TODO

Optional<ResourceKey<T>> unwrapKey() @ L40

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

参数:

说明:

TODO

Holder.Kind kind() @ L42

  • 方法名:kind
  • 源码定位:L42
  • 返回类型:Holder.Kind
  • 修饰符:package-private

参数:

说明:

TODO

boolean canSerializeIn(HolderOwner<T> registry) @ L44

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

参数:

  • registry: HolderOwner

说明:

TODO

default String getRegisteredName() @ L46

  • 方法名:getRegisteredName
  • 源码定位:L46
  • 返回类型:String
  • 修饰符:default

参数:

说明:

TODO

static <T> Holder<T> direct(T value) @ L50

  • 方法名:direct
  • 源码定位:L50
  • 返回类型: Holder
  • 修饰符:static

参数:

  • value: T

说明:

TODO

static <T> Holder<T> direct(T value, DataComponentMap components) @ L54

  • 方法名:direct
  • 源码定位:L54
  • 返回类型: Holder
  • 修饰符:static

参数:

  • value: T
  • components: DataComponentMap

说明:

TODO

代码

public interface Holder<T> {
    T value();
 
    boolean isBound();
 
    boolean areComponentsBound();
 
    boolean is(Identifier key);
 
    boolean is(ResourceKey<T> key);
 
    boolean is(Predicate<ResourceKey<T>> predicate);
 
    boolean is(TagKey<T> tag);
 
    @Deprecated
    boolean is(Holder<T> holder);
 
    Stream<TagKey<T>> tags();
 
    DataComponentMap components();
 
    Either<ResourceKey<T>, T> unwrap();
 
    Optional<ResourceKey<T>> unwrapKey();
 
    Holder.Kind kind();
 
    boolean canSerializeIn(HolderOwner<T> registry);
 
    default String getRegisteredName() {
        return this.unwrapKey().map(key -> key.identifier().toString()).orElse("[unregistered]");
    }
 
    static <T> Holder<T> direct(T value) {
        return new Holder.Direct<>(value, DataComponentMap.EMPTY);
    }
 
    static <T> Holder<T> direct(T value, DataComponentMap components) {
        return new Holder.Direct<>(value, components);
    }
 
    public record Direct<T>(T value, DataComponentMap components) implements Holder<T> {
        @Override
        public boolean isBound() {
            return true;
        }
 
        @Override
        public boolean areComponentsBound() {
            return true;
        }
 
        @Override
        public boolean is(Identifier key) {
            return false;
        }
 
        @Override
        public boolean is(ResourceKey<T> key) {
            return false;
        }
 
        @Override
        public boolean is(TagKey<T> tag) {
            return false;
        }
 
        @Override
        public boolean is(Holder<T> holder) {
            return this.value.equals(holder.value());
        }
 
        @Override
        public boolean is(Predicate<ResourceKey<T>> predicate) {
            return false;
        }
 
        @Override
        public Either<ResourceKey<T>, T> unwrap() {
            return Either.right(this.value);
        }
 
        @Override
        public Optional<ResourceKey<T>> unwrapKey() {
            return Optional.empty();
        }
 
        @Override
        public Holder.Kind kind() {
            return Holder.Kind.DIRECT;
        }
 
        @Override
        public String toString() {
            return "Direct{" + this.value + "}";
        }
 
        @Override
        public boolean canSerializeIn(HolderOwner<T> registry) {
            return true;
        }
 
        @Override
        public Stream<TagKey<T>> tags() {
            return Stream.of();
        }
    }
 
    public static enum Kind {
        REFERENCE,
        DIRECT;
    }
 
    public static class Reference<T> implements Holder<T> {
        private final HolderOwner<T> owner;
        private @Nullable Set<TagKey<T>> tags;
        private @Nullable DataComponentMap components;
        private final Holder.Reference.Type type;
        private @Nullable ResourceKey<T> key;
        private @Nullable T value;
 
        protected Reference(Holder.Reference.Type type, HolderOwner<T> owner, @Nullable ResourceKey<T> key, @Nullable T value) {
            this.owner = owner;
            this.type = type;
            this.key = key;
            this.value = value;
        }
 
        public static <T> Holder.Reference<T> createStandAlone(HolderOwner<T> owner, ResourceKey<T> key) {
            return new Holder.Reference<>(Holder.Reference.Type.STAND_ALONE, owner, key, null);
        }
 
        @Deprecated
        public static <T> Holder.Reference<T> createIntrusive(HolderOwner<T> owner, @Nullable T value) {
            return new Holder.Reference<>(Holder.Reference.Type.INTRUSIVE, owner, null, value);
        }
 
        public ResourceKey<T> key() {
            if (this.key == null) {
                throw new IllegalStateException("Trying to access unbound value '" + this.value + "' from registry " + this.owner);
            } else {
                return this.key;
            }
        }
 
        @Override
        public T value() {
            if (this.value == null) {
                throw new IllegalStateException("Trying to access unbound value '" + this.key + "' from registry " + this.owner);
            } else {
                return this.value;
            }
        }
 
        @Override
        public boolean is(Identifier key) {
            return this.key().identifier().equals(key);
        }
 
        @Override
        public boolean is(ResourceKey<T> key) {
            return this.key() == key;
        }
 
        private Set<TagKey<T>> boundTags() {
            if (this.tags == null) {
                throw new IllegalStateException("Tags not bound");
            } else {
                return this.tags;
            }
        }
 
        @Override
        public boolean is(TagKey<T> tag) {
            return this.boundTags().contains(tag);
        }
 
        @Override
        public boolean is(Holder<T> holder) {
            return holder.is(this.key());
        }
 
        @Override
        public boolean is(Predicate<ResourceKey<T>> predicate) {
            return predicate.test(this.key());
        }
 
        @Override
        public boolean canSerializeIn(HolderOwner<T> context) {
            return this.owner.canSerializeIn(context);
        }
 
        @Override
        public Either<ResourceKey<T>, T> unwrap() {
            return Either.left(this.key());
        }
 
        @Override
        public Optional<ResourceKey<T>> unwrapKey() {
            return Optional.of(this.key());
        }
 
        @Override
        public Holder.Kind kind() {
            return Holder.Kind.REFERENCE;
        }
 
        @Override
        public boolean isBound() {
            return this.key != null && this.value != null;
        }
 
        @Override
        public boolean areComponentsBound() {
            return this.components != null;
        }
 
        void bindKey(ResourceKey<T> key) {
            if (this.key != null && key != this.key) {
                throw new IllegalStateException("Can't change holder key: existing=" + this.key + ", new=" + key);
            } else {
                this.key = key;
            }
        }
 
        protected void bindValue(T value) {
            if (this.type == Holder.Reference.Type.INTRUSIVE && this.value != value) {
                throw new IllegalStateException("Can't change holder " + this.key + " value: existing=" + this.value + ", new=" + value);
            } else {
                this.value = value;
            }
        }
 
        void bindTags(Collection<TagKey<T>> tags) {
            this.tags = Set.copyOf(tags);
        }
 
        public void bindComponents(DataComponentMap components) {
            this.components = components;
        }
 
        @Override
        public Stream<TagKey<T>> tags() {
            return this.boundTags().stream();
        }
 
        @Override
        public DataComponentMap components() {
            return Objects.requireNonNull(this.components, "Components not bound yet");
        }
 
        @Override
        public String toString() {
            return "Reference{" + this.key + "=" + this.value + "}";
        }
 
        protected static enum Type {
            STAND_ALONE,
            INTRUSIVE;
        }
    }
}

引用的其他类