最近、私は工場とシングルトンの設計パターンを学び、一緒に実装したいと考えています。私が抱えている問題は、シングルトンクラスで定義されているgetInstance
メソッドが静的でなければならないことです。そのため、このメソッドをインターフェイスでどのように宣言できますか? Java 1.8では、インタフェース内の静的メソッドが許可されていますしかし、は、メソッド本体が実際のインタフェース内に実装されていると主張しています。これは、ファクトリでシングルトンを使用する効率を直ちに減じます。例えば工場からシングルトンインスタンスを作成することは可能ですか?
:のように、工場から
// 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);
}
}
::のように実装する際
// Logger.java (interface)
public interface Logger {
public Logger getInstance();
public static void log(String message);
}
してエラーが発生した
// 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;
}
}
うまくいけば、これは私の苦境を説明します。私が得ているエラーはmissing method body
これを解決する方法はありますか?
静的なインターフェースメソッドはありません。 –
なぜインターフェース上に 'static'メソッドが必要でしょうか?静的メソッドにはその型から直接アクセスするので、 'getInstance'メソッドがあるかどうかはすでに分かります。代わりに 'getInstance'メソッドを' LoggerType'列挙型に 'abstract'メソッドとして置くことで、switch文を削除することができます。 –
インターフェイスから定義を削除すると、問題が完全に修正されました。私はインターフェイスで定義されたメソッドしか実装できないと思っていましたか?とにかく、歓声。 – user2228313