如何避免多次创建相同的对象引用?

tso*_*orn 4 java

想象一下,我有一些看起来像这样的类:

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)

Lui*_*oza 5

car1car2延长同一个对象?

一个类可以从另一个类扩展.对象不扩展任何东西.在Java中,继承仅适用于类和接口.你在这里做的是创建同一个类的两个实例Audi,并Audi从中扩展Car.

有没有办法可以做到这一点?

没有.

我问,因为我想避免两次生成和存储相同的图像.

这是一个值得回答的正确问题.您真正的问题是避免多次创建相同的对象实例.为此,最好通过使用a来使用对象池WeakHashMap.以下是对使用此结构的原因的解释:您何时使用WeakHashMap或WeakReference?