
Also nach allem, was ich bisher gefunden habe, ist das, was ich hier machen möchte, mit Java gar nicht möglich, aber fragen schadet ja nicht

Ich habe eine Klasse, die mir verschiedene Funktionen anbietet:
Code: Alles auswählen
public abstract class Escaper {
private final ArrayList<Character> escapeList;
// Irgendein lustiger Konstruktor ..
public final String escape(String txt) {
// Zugriff auf escapeList
}
public final String unescape(String txt) {
// Zugriff auf escapeList
}
}
Code: Alles auswählen
public class CSVEscaper extends Escaper {
//
}
Mein "Escaper" soll allerdings ein Singleton sein. Bzw alle von Escaper abgeleiteten Klassen sollen Singletons sein.
Mein Ziel ist, dass etwas ala folgendem funktioniert:
Code: Alles auswählen
public class CSVEscaper extends Escaper {
private void setUpSpecialChars() {
// befüllt nun die (eigene) ArrayList namens escapeList
this.escapeList.add(';');
}
}
public class XMLEscaper extends Escaper {
private void setUpSpecialChars() {
// befüllt nun die (eigene) ArrayList namens escapeList
this.escapeList.add('<');
}
}
// iwo anders:
String escapedText = CSVEscaper.getInstance().escape("Ich bin <ein; boeser Text"); // ergibt: "Ich bin <ein boeser Text"
String escapedText = XMLEscaper.getInstance().escape("Ich bin <ein; boeser Text"); // ergibt: "Ich bin ein; boeser Text"
Prinzipiell müsste "Escaper" ja dann folgendermaßen aussehen:
Code: Alles auswählen
public abstract class Escaper {
private final ArrayList<Character> escapeList;
private static final Escaper instance = new Escaper(); //******************
private Escaper() {
this.escapeList = new ArrayList<Character>();
this.setUpSpecialChars();
}
public static Escaper getInstance() {
return Escaper.instance;
}
public abstract void setUpSpecialChars();
}
Escaper ist ja abstract und kann daher nicht instanziiert werden.
Wenn ich Escaper nun nicht mehr abstract deklariere (was ich nicht möchte, denn einen reinen Escaper soll es nicht geben) habe ich das Problem, dass ich damit NUR 1 Singleton Objekt für ALLE von Escaper abgeleiteten Klassen habe.
Sprich:
Code: Alles auswählen
if (CSVEscaper.getInstance() == XMLEscaper.getInstance()) {
System.out.println("VERDAMMT");
}
else {
System.out.println("So soll es sein!");
}
Benutz Generics

Nächster Versuch:
Code: Alles auswählen
public abstract class Escaper<T extends Escaper> {
private final ArrayList<Character> escapeList;
private static final T instance = new T(); //******************
private Escaper() {
this.escapeList = new ArrayList<Character>();
this.setUpSpecialChars();
}
public static T getInstance() { //********************
return T.instance; //**************************
}
public abstract void setUpSpecialChars();
}
Ich hab nun schon einiges dazu gelesen und noch ein paar andere verrückte Dinge ausprobiert, bin aber bisher auf keinen grünen Zweig gekommen.non-static type variable T cannot be referenced from a static context
Ziel ist wie schon angemerkt spezielle Escaper (für CSV, XML, ...) einfach von Escaper ableiten zu können, die Methode setUpSpecialChars jeweils zu implementieren und sich dann daran zu erfreuen ^^
Ideen? Vorschläge? Hilfe? ^^
Ich hoffe ihr versteht mein Problem bzw, was ich damit bezwecke.
Über Ideen zu einem anderen Design würde ich mich auch freuen?
*edit: Links*
http://c2.com/cgi/wiki?InheritedJavaSingletonProblem
http://en.wikipedia.org/wiki/Generics_in_Java
http://docstore.mik.ua/orelly/java-ent/jnut/ch03_04.htm
http://stackoverflow.com/questions/4285 ... subclasses
http://www.coderanch.com/t/417424/java/ ... ave-public
http://www.coderanch.com/t/458156/java/ ... -executing
http://www.coderanch.com/t/470696/java/ ... eton-Class
http://stackoverflow.com/questions/9164 ... ss-in-java
http://stackoverflow.com/questions/6038 ... d-generics
http://www.angelikalanger.com/GenericsF ... eters.html