org.rx.core.Container Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of rxlib Show documentation
Show all versions of rxlib Show documentation
A set of utilities for Java
package org.rx.core;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.rx.core.exception.InvalidException;
import org.rx.util.function.Func;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import static org.rx.core.App.NON_WARNING;
import static org.rx.core.App.sneakyInvoke;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class Container {
@Getter
private static final Container instance = new Container();
private final Map holder = new ConcurrentHashMap<>();
public T getOrRegister(Class type) {
return (T) holder.computeIfAbsent(type.getName(), k -> Reflects.newInstance(type));
}
public T getOrRegister(String name, Func func) {
return (T) holder.computeIfAbsent(name, k -> sneakyInvoke(func));
}
public T get(Class type) {
return get(type.getName());
}
@SuppressWarnings(NON_WARNING)
public T get(String name) {
T instance = (T) holder.get(name);
if (instance == null) {
throw new InvalidException("%s not registered", name);
}
return instance;
}
public void register(Class type, T instance) {
register(type.getName(), instance);
}
public void register(String name, T instance) {
if (instance == null) {
throw new InvalidException("%s instance can not be null", name);
}
holder.put(name, instance);
}
public void unregister(String name) {
holder.remove(name);
}
}