EncoderCache.java

net.minecraft.util.EncoderCache

信息

  • 全限定名:net.minecraft.util.EncoderCache
  • 类型:public class
  • 包:net.minecraft.util
  • 源码路径:src/main/java/net/minecraft/util/EncoderCache.java
  • 起始行号:L13
  • 职责:

    TODO

字段/常量

  • cache
    • 类型: LoadingCache<EncoderCache.Key<?,?>,DataResult<?>>
    • 修饰符: private final
    • 源码定位: L14
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.util.EncoderCache.Key
    • 类型: record
    • 修饰符: private
    • 源码定位: L52
    • 说明:

      TODO

构造器

public EncoderCache(int maximumSize) @ L16

  • 构造器名:EncoderCache
  • 源码定位:L16
  • 修饰符:public

参数:

  • maximumSize: int

说明:

TODO

方法

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

public <A> Codec<A> wrap(Codec<A> codec) @ L32

参数:

说明:

TODO

代码

public class EncoderCache {
    private final LoadingCache<EncoderCache.Key<?, ?>, DataResult<?>> cache;
 
    public EncoderCache(int maximumSize) {
        this.cache = CacheBuilder.newBuilder()
            .maximumSize(maximumSize)
            .concurrencyLevel(1)
            .softValues()
            .build(new CacheLoader<EncoderCache.Key<?, ?>, DataResult<?>>() {
                {
                    Objects.requireNonNull(EncoderCache.this);
                }
 
                public DataResult<?> load(EncoderCache.Key<?, ?> key) {
                    return key.resolve();
                }
            });
    }
 
    public <A> Codec<A> wrap(Codec<A> codec) {
        return new Codec<A>() {
            {
                Objects.requireNonNull(EncoderCache.this);
            }
 
            @Override
            public <T> DataResult<Pair<A, T>> decode(DynamicOps<T> ops, T input) {
                return codec.decode(ops, input);
            }
 
            @Override
            public <T> DataResult<T> encode(A input, DynamicOps<T> ops, T prefix) {
                return EncoderCache.this.cache
                    .getUnchecked(new EncoderCache.Key<>(codec, input, ops))
                    .map(value -> (T)(value instanceof Tag tag ? tag.copy() : value));
            }
        };
    }
 
    private record Key<A, T>(Codec<A> codec, A value, DynamicOps<T> ops) {
        public DataResult<T> resolve() {
            return this.codec.encodeStart(this.ops, this.value);
        }
 
        @Override
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            } else {
                return !(obj instanceof EncoderCache.Key<?, ?> key)
                    ? false
                    : this.codec == key.codec && this.value.equals(key.value) && this.ops.equals(key.ops);
            }
        }
 
        @Override
        public int hashCode() {
            int result = System.identityHashCode(this.codec);
            result = 31 * result + this.value.hashCode();
            return 31 * result + this.ops.hashCode();
        }
    }
}

引用的其他类