java-commons/src/main/java/de/nclazz/commons/util/Canon.java

44 lines
1.1 KiB
Java

package de.nclazz.commons.util;
import lombok.NonNull;
import java.util.WeakHashMap;
public class Canon<T> {
private static final WeakHashMap<Class<?>, Canon<?>> globalCanon = new WeakHashMap<>();
private final WeakHashMap<T,T> canon;
public Canon(int initialCapacity) {
this.canon = new WeakHashMap<>(initialCapacity);
}
public Canon() {
this(32);
}
public T getCanonical(T object) {
synchronized (this.canon) {
T canonical = this.canon.get(object);
if(canonical == null) {
this.canon.put(object, object);
canonical = object;
}
return canonical;
}
}
@SuppressWarnings("unchecked") //Type is directly fetched from instance
public static <T> T canonical(@NonNull T object) {
Class<? extends T> clazz = (Class<? extends T>) object.getClass();
Canon<T> canon = (Canon<T>) globalCanon.get(clazz);
if(canon == null) {
canon = new Canon<>();
globalCanon.put(clazz, canon);
}
return canon.getCanonical(object);
}
}