【发布时间】:2016-08-22 22:59:09
【问题描述】:
我已经阅读了一些关于静态变量缺点的问题(例如why are static variables considered evil,但我发现在选择避免使用它们的最佳解决方案时有些困难。
例如,在我的简单国际象棋应用程序中,我有一个抽象类 Piece,它有许多子类。 每个 Piece 都必须有一个 BufferedImage 变量,image,但我只想为每个 Piece 加载每个图像一次。
使用静态变量会很容易,比如:
abstract class Piece
{
// ...
public abstract BufferedImage getImage();
}
class Bishop extends Piece
{
private static final BufferedImage image = null;
static{
try{
image = ImageIO.read(ClassLoader.getSystemResource("chess/img/pieces/Bishop.png"));
}
catch(IOException ex){
// ...
}
}
public BufferedImage getImage(){
return image;
}
}
当然这段代码不遵循OOP,image变量也没有继承。
解决方案是将所有图像加载到外部类中,并让所有子类实例保持对同一对象的引用:
abstract class Piece
{
final BufferedImage image;
public Piece(/* ... */ BufferedImage image){
this.image = image;
}
public BufferedImage getImage(){
return image;
}
}
class Bishop extends Piece
{
public Bishop(/* ... */ BufferedImage image){
super(/* ... */ image);
// ...
}
}
但是如果我需要从 n 个不同的类创建子类实例怎么办? 假设我只创建这些 n 类的一个实例,图像将至少加载 n 次。
我考虑将图像引用保留在单例模式设计的类中,但我也想保留 Piece 类中的 image 变量,以便对每个 Piece 简单地使用 getImage() 方法.
将第二种解决方案与 Singleton 模式结合使用是否是一个好的设计,所以我会将对使用 SingletonClass.getXxxImage() 等方法获得的相同 BufferedImage 的引用传递给每个 Piece 的子类构造函数?
或者有没有更好的方法?当然,多次加载 BufferedImage 并没有那么邪恶,但我希望有一个通用的解决方案来避免无用的代码重复。
感谢您的帮助!
【问题讨论】:
-
可以关注 Solid principal en.m.wikipedia.org/wiki/SOLID_(object-oriented_design)
-
将图像传递给片段构造函数绝对是正确方法的开始。
标签: java inheritance static singleton