ich zu vermeiden habe schon einige Fragen über die Nachteile der statischen Variablen lesen (zum Beispiel why are static variables considered evil, aber ich finde einige Schwierigkeiten bei der die beste Lösung der Wahl zu vermeiden, sie zu benutzen.best practice statische Felder
In meinem einfachen Schach-Anwendung, zum Beispiel, ich habe eine abstrakte Klasse, Stück, mit vielen Unterklassen. jedes Stück eine BufferedImage Variable haben muss, Bild, aber i jedes Bild nur einmal für jedes Stück laden mag.
Dies wäre sehr einfach mit statischen Variablen, etwa wie t Hut:
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;
}
}
Natürlich ist dieser Code nicht folgt OOP und Vererbung für die Bild Variable nicht verwendet.
Eine Lösung wäre, alle Bilder in einer externen Klasse zu laden, und alle Unterklassen Instanzen lassen den Verweis auf das gleiche Objekt zu halten:
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);
// ...
}
}
Aber was ist, wenn ich die Unterklassen-Instanzen erstellen müssen von n verschiedene Klassen? Die Bilder würden mindestens n mal geladen werden, vorausgesetzt, ich erstelle nur eine Instanz dieser n Klassen.
Ich habe erwogen, die Bilder Referenz in einem Singleton-Muster entworfen Klasse zu halten, aber ich möchte auch die Bild Variable in der Klasse Stück, um einfach die Methode getImage() für jedes Stück zu verwenden.
Ist es ein guter Entwurf, um die zweite Lösung kombiniert mit dem Singleton-Muster zu verwenden, so würde ich den Konstruktor jedes Stücks die Referenz auf die gleiche BufferedImage mit einer Methode wie SingletonClass.getXxxImage() übergeben?
Oder gibt es einen besseren Ansatz? Natürlich wäre es nicht so übel, ein BufferedImage mehr als einmal zu laden, aber ich hätte gerne eine allgemeine Lösung, um nutzlose Code-Wiederholungen zu vermeiden.
Danke für Ihre Hilfe!
können folgen Solid-Prinzipal https://en.m.wikipedia.org/wiki/SOLID_(objectively_designed) –
Die Übergabe des Bildes an den Stück Konstruktor ist definitiv der Beginn der richtigen Ansatz. –