A类:
private String name;
private double[] data;
private double[] data1;
private double[] data2;
private double[] data3;
private double[] data4;
public A() (String name, double[] data, double[] data1... double[] data4) {
this.name = name;
this.data = data;
....
this.data4= data4;
}
And getter methods...
B类:
class B
String[] names = {"1", "2", "3", "4", "5", ... "20"};
Map<String, Report> types;
static {
for(String name : names) {
types.put(name, new A(name, getRandomData(), getRandomData(), getRandomData(), name.getData3(), name.getData4()))
}
}
public static Collection<A> getDatas() {
Collection<A> originals = types.values();
List<A> result = new ArrayList<>();
for (A original: originals) {
A data = (new A(original.getData(),
original.getDat1(),
original.getData2().clone(),
original.getData3().clone(),
original.getData4().clone()));
result.add(data);
return result;
}
private static double[] getRandomData() {
double[] result = new double[500000];
Random random = new Random();
for (int i = 0; i < result.length; i++) {
result[i] = random.nextDouble();
}
return result;
}
我无法更改 B 类中的任何内容,但我可以修改 A 类并添加额外的类。
我已经实现了享元模式,但它通常会阻止内存使用量增长,而不是实际上减少 RAM 使用量。
我知道巨大的 RAM 使用来自 getRandomData() 方法,它为每个 double[] 数组创建 double[500000] 随机元素,但 B 类中的所有内容都需要保留。
如果我删除 clone(),它会直接将 RAM 使用量从 800~MB 减少到 400~MB,但我也无法更改这个。我问了解决这个问题的学生,他们通常使用 .clone(),有人告诉我为享元模式缓存 .clone(),但是没有办法 declone() 克隆的数组不是吗?
那么有人可以告诉我如何在 FlyweightFactory 类中缓存克隆吗?我花了几个小时来解决这个问题,但我仍然在为这个问题而苦苦挣扎......