想象一下,我有一些看起来像这样的类:
class Car {
private Image carImage;
public Car(int imageIndex) {
switch (imageIndex) {
case 1: carImage = generateCarImage(1); break;
# and so forth
}
}
}
class Audi extends Car {
private int numberOfSeats;
public Audi(int imageIndex, int numberOfSeats) {
super(imageIndex);
this.numberOfSeats = numberOfSeats;
}
}
Run Code Online (Sandbox Code Playgroud)
现在假设我使用相同的图像创建多个奥迪:
Audi car1 = new Audi(1,2);
Audi car2 = new Audi(1,3);
Run Code Online (Sandbox Code Playgroud)
car1和car2会延伸相同的物体吗?我假设没有,但有没有办法可以做到这一点?我问,因为我想避免两次生成和存储相同的图像.
编辑:
这两个奥迪会参考同一辆车吗,例如图像只生成和存储一次,对一个的任何变化都会影响另一个吗?
class Car {
private Image carImage;
public Car(int imageIndex) {
switch (imageIndex) {
case 1: # carImage = readfile(1.jpeg)
# and so forth
}
}
}
class Audi{
private int numberOfSeats;
private Car car;
public Audi(Car car, int numberOfSeats) {
this.car = car;
this.numberOfSeats = numberOfSeats;
}
}
Car car = new Car(1);
Audi audi1 = new Audi(car,2);
Audi audi2 = new Audi(car,2);
Run Code Online (Sandbox Code Playgroud)
编辑2:
这里有很多好的答案,最后我结合使用它们来创建一个像样的解决方案.我最初的问题并没有很好地定义,主要是因为我不知道自己究竟是什么.
无论如何,对于这个问题,不可能PartsInfo事先生成所有数据(在下面的例子中),也不能显式生成数据(如上面的switch-case例子所暗示的那样).下面解决方案的最大问题是,如果PartsInfo不检索整个内容(在调用Car.getPartsInfo()时在解决方案中完成)或创建同一对象的多个实例,我无法访问单个字段(在这种情况下) Car类将获得自己的PartsInfo变量).
弱散列图也可以,但不是最优的,因为问题不是垃圾收集,而是存储在不同实例中的大量相同数据.
如果ID类似于"audi-a4-2003",并且PartsInfo所有"audi-a4-2003"与颜色,所有者,年龄,座位数等无关,则该解决方案适用,但"audi-a4完全不同" -2004" .
谢谢
Class PartsInfo {
// lots of stuff I'd rather not create nor save multiple times
}
Class PartsInfoFactory {
private static HashMap<String, PartsInfo> partsInfoMap = new HashMap<String, PartsInfo>();
public static getPartsInfo(String id) {
if (!partsInfoMap.containsKey(id)) {
generatePartsInfo(id);
}
return partsInfoMap(id)
}
private static generatePartsInfo(String id) {
// Do stuff I don't want to do twice for same ID
partsInfoMap.put(id)
}
}
Class Car {
private Color color;
private String id;
// Notice that PartsInfo is not stored here
public Car(Color color, String id) {
this.color = color;
this.id = id;
}
public PartsInfo getPartsInfo() {
return PartsInfoFactory.getPartsInfo(id);
}
}
Run Code Online (Sandbox Code Playgroud)
将
car1和car2延长同一个对象?
一个类可以从另一个类扩展.对象不扩展任何东西.在Java中,继承仅适用于类和接口.你在这里做的是创建同一个类的两个实例Audi,并Audi从中扩展Car.
有没有办法可以做到这一点?
没有.
我问,因为我想避免两次生成和存储相同的图像.
这是一个值得回答的正确问题.您真正的问题是避免多次创建相同的对象实例.为此,最好通过使用a来使用对象池WeakHashMap.以下是对使用此结构的原因的解释:您何时使用WeakHashMap或WeakReference?
| 归档时间: |
|
| 查看次数: |
3190 次 |
| 最近记录: |