44 lines
1.1 KiB
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);
|
|
}
|
|
|
|
}
|