我想概括出以下模式:的JavaFX:錯誤記錄的ChangeListener
setChangeListener = c -> {
try {
// do something dangerous
} catch (final IOException e) {
logger.error(e.getLocalizedMessage(), e);
}
};
我想用這樣的:
errorLoggingSetChangeListener = c -> {
// do something dangerous
};
我在想這個問題:
public class ErrorLoggingSetChangeListener<T> implements SetChangeListener<T> {
private static final Logger logger = Logger.getLogger(ErrorLoggingSetChangeListener.class);
private final SetChangeListener<T> delegate;
@Override
public void onChanged(final SetChangeListener.Change<? extends T> change) {
try {
delegate.onChanged(change);
} catch (final Exception e) {
if (logger.isEnabledFor(Level.ERROR)) {
logger.error(e.getLocalizedMessage(), e);
}
}
}
public ErrorLoggingSetChangeListener(final SetChangeListener<T> delegate) {
super();
this.delegate = delegate;
}
}
但這是不可能的,因爲ErrorLoggingSetChangeListener不是一個Functional接口。
是否有機會將此類轉換爲功能接口?
這並不編譯:
public interface ErrorLoggingSetChangeListener<T> extends SetChangeListener<T> {
static final Logger logger = Logger.getLogger(ErrorLoggingSetChangeListener.class);
@Override
default void onChanged(final SetChangeListener.Change<? extends T> change) {
try {
SetChangeListener.super.onChanged(change);
} catch (final Exception e) {
if (logger.isEnabledFor(Level.ERROR)) {
logger.error(e.getLocalizedMessage(), e);
}
}
}
}
但這也不能編譯:
errorLoggingSetChangeListener = new ErrorLoggingSetChangeListener<>(c -> {
throw new IOException();
});
該錯誤消息是
未處理的異常[..]
。
沒有意義,您嘗試調用未實現的函數。超級的功能沒有實現,因爲你覆蓋它。你只提供一個界面功能,但試着用它2次... – JohnnyAW
@JohnnyAW同意。如何解決這個問題? – kerner1000
你不可能以你想使用它的方式使用它(至少在java中,也許其他語言可以使用它)。 Waitö讓我想想......使用你的'ErrorLoggingSetChangeListener'的 – JohnnyAW