최근에 팩토리 및 싱글 톤 디자인 패턴을 배웠고 함께 구현하려고합니다. 내가 겪고있는 문제는 싱글 톤 클래스에 정의 된 getInstance
메서드가 정적이어야하므로 인터페이스에서이 메서드를 어떻게 선언 할 수 있습니까? Java 1.8은 인터페이스 내에서 정적 메서드를 허용했습니다. 그러나은 메서드 본문이 실제 인터페이스 내에서 구현된다는 것을 강조합니다. 즉, 팩터 리에서 싱글 톤을 사용하는 효율성을 즉시 차감합니다. 희망팩토리에서 생성 된 싱글 톤 인스턴스를 가질 수 있습니까?
// 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;
}
}
이 내 처지를 설명 : 같은 공장에서
// 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);
}
오류가 발생합니다. 내가 얻는 오류는 missing method body
이 문제를 해결할 수있는 방법이 있습니까?
'정적'인터페이스 방법은 없습니다. –
왜 인터페이스에'static' 메소드가 필요한가요? 정적 메서드는 해당 형식을 통해 직접 액세스하므로'getInstance' 메서드가 있는지 이미 알고 있습니다. 대신에'getInstance' 메쏘드를'LoggerType' 열거 형에'abstract' 메쏘드로 놓을 수 있습니다. 그것은 당신의 switch 문을 제거 할 것입니다. –
인터페이스에서 정의를 제거하면 문제가 완전히 해결되었습니다. 인터페이스에 정의 된 메서드 만 구현할 수 있다고 생각했습니다. 어쨌든 건배. – user2228313