Kürzlich habe ich von der Fabrik und Singleton Design-Muster gelernt und möchte sie zusammen implementieren. Das Problem, das ich habe, ist, dass die in einer Singleton-Klasse definierte Methode getInstance
statisch sein muss, also wie kann ich diese Methode in einer Schnittstelle deklarieren? Java 1.8 erlaubt statische Methoden innerhalb von Schnittstellen aber dies besteht darauf, dass eine Methode Körper innerhalb der tatsächlichen Schnittstelle implementiert ist - das zieht sofort von der Wirksamkeit der Verwendung der Singleton mit einer Fabrik.Ist es möglich, eine Singleton-Instanz von einer Fabrik erstellt
Zum Beispiel:
// Logger.java (interface)
public interface Logger {
public Logger getInstance();
public static void log(String message);
}
erzeugt einen Fehler, wenn sie umgesetzt werden, wie:
// File implementation of Logger (also a database implementation)
public class FileLogger implements Logger {
private static FileLogger instance;
private FileLogger() {
}
@Override
public static Logger getInstance() {
synchronized (FileLogger.class) {
if (instance == null) {
instance = new FileLogger();
}
}
return instance;
}
@Override
public void log(String message) {
System.out.println(new Date() + " " + message);
}
}
aus einer Fabrik wie:
// Factory pattern to create differing types of logger
public class LoggerFactory {
private LoggerFactory() {
}
public static Logger getLogger(LoggerType loggerType) {
Logger logger;
switch (loggerType) {
case DATABASE:
logger = DatabaseLogger.getInstance();
break;
default:
logger = FileLogger.getInstance();
}
return logger;
}
public enum LoggerType {
DATABASE, FILE;
}
}
Hoffentlich erklärt meine missliche Lage. Der Fehler, den ich bekomme, ist missing method body
Gibt es Möglichkeiten, dies zu lösen?
Es gibt keine "statische" Schnittstellenmethode. –
Warum benötigen Sie die 'static' Methode an der Schnittstelle? Sie greifen auf statische Methoden über ihren Typ direkt zu, so dass Sie bereits wissen, ob es eine 'getInstance'-Methode gibt. Sie könnten stattdessen die 'getInstance'-Methode als eine' abstrakte' Methode in der 'LoggerType'-Enumeration platzieren, die Ihre switch-Anweisung eliminieren würde. –
Das Entfernen der Definition von der Schnittstelle hat mein Problem vollständig behoben. Ich dachte, Sie könnten nur Methoden implementieren, die in der Schnittstelle definiert sind? Wie auch immer, Prost. – user2228313