perf[storage]: 简化storage,让recycle的方式更加简洁

This commit is contained in:
godotg
2022-10-26 18:27:52 +08:00
parent 68a64d0e0e
commit 63d0544696
3 changed files with 36 additions and 29 deletions
@@ -43,8 +43,6 @@ public interface IStorageManager {
@Nullable
Storage<?, ?> getStorage(Class<?> clazz);
Map<Class<?>, Boolean> allStorageUsableMap();
Map<Class<?>, Storage<?, ?>> storageMap();
void updateStorage(Class<?> clazz, Storage<?, ?> storage);
@@ -60,11 +60,6 @@ public class StorageManager implements IStorageManager {
*/
private final Map<Class<?>, Storage<?, ?>> storageMap = new HashMap<>();
/**
* 全部的Storage定义,key为对应的excel配置表,value为当前配置表是否在当前项目中使用
*/
private final Map<Class<?>, Boolean> allStorageUsableMap = new HashMap<>();
public StorageConfig getStorageConfig() {
return storageConfig;
}
@@ -105,7 +100,6 @@ public class StorageManager implements IStorageManager {
Storage<?, ?> storage = new Storage<>();
storage.init(resource.getInputStream(), definition.getClazz(), fileExtName);
storageMap.putIfAbsent(clazz, storage);
allStorageUsableMap.put(clazz, false);
}
} catch (Exception e) {
throw new RuntimeException(e);
@@ -155,7 +149,7 @@ public class StorageManager implements IStorageManager {
ReflectionUtils.makeAccessible(field);
ReflectionUtils.setField(field, bean, storage);
allStorageUsableMap.put(resourceClazz, true);
storage.setRecycle(false);
});
}
}
@@ -163,28 +157,27 @@ public class StorageManager implements IStorageManager {
@Override
public void initAfter() {
if (storageConfig.isRecycle()) {
allStorageUsableMap.entrySet().stream()
.filter(it -> !it.getValue())
.map(it -> it.getKey())
.forEach(it -> storageMap.remove(it));
storageMap.entrySet().stream()
.filter(it -> it.getValue().isRecycle())
.map(it -> it.getValue())
.forEach(it -> it.recycleStorage());
} else {
storageMap.entrySet().stream()
.map(it -> it.getValue())
.forEach(it -> it.setRecycle(false));
}
}
@Override
public Storage<?, ?> getStorage(Class<?> clazz) {
var usable = allStorageUsableMap.get(clazz);
if (usable == null) {
var storage = storageMap.get(clazz);
if (storage == null) {
throw new RunException("没有定义[{}]的Storage,无法获取", clazz.getCanonicalName());
}
if (!usable) {
if (storage.isRecycle()) {
throw new RunException("Storage没有使用[{}],为了节省内存提前释放了它;只有使用ResInjection注解的Storage才能被动态获取或者关闭配置recycle属性", clazz.getCanonicalName());
}
return storageMap.get(clazz);
}
@Override
public Map<Class<?>, Boolean> allStorageUsableMap() {
return allStorageUsableMap;
return storage;
}
@Override
@@ -192,7 +185,6 @@ public class StorageManager implements IStorageManager {
return storageMap;
}
@Override
public void updateStorage(Class<?> clazz, Storage<?, ?> storage) {
storageMap.put(clazz, storage);
@@ -32,18 +32,18 @@ public class Storage<K, V> {
private Class<V> clazz;
private final Map<K, V> dataMap = new HashMap<>();
// 当前配置表是否在当前项目中使用,没有被使用的会清楚data数据,以达到节省内存的目的
private boolean recycle = true;
private Map<K, V> dataMap = new HashMap<>();
// 非唯一索引
private final Map<String, Map<Object, List<V>>> indexMap = new HashMap<>();
private Map<String, Map<Object, List<V>>> indexMap = new HashMap<>();
// 唯一索引
private final Map<String, Map<Object, V>> uniqueIndexMap = new HashMap<>();
private Map<String, Map<Object, V>> uniqueIndexMap = new HashMap<>();
private IdDef idDef;
private Map<String, IndexDef> indexDefMap;
public Storage() {
}
public void init(InputStream inputStream, Class<?> resourceClazz, String suffix) {
try {
this.clazz = (Class<V>) resourceClazz;
@@ -67,6 +67,23 @@ public class Storage<K, V> {
}
}
public void recycleStorage() {
recycle = true;
dataMap = null;
indexMap = null;
uniqueIndexMap = null;
idDef = null;
indexDefMap = null;
}
public boolean isRecycle() {
return recycle;
}
public void setRecycle(boolean recycle) {
this.recycle = recycle;
}
public Collection<V> getAll() {
return Collections.unmodifiableCollection(dataMap.values());
}