私は次のパターン一般化したいと思います:のJavaFX:エラー・ログ記録のChangeListener
:errorLoggingSetChangeListener = c -> {
// do something dangerous
};
私はこのことについて考えていた:
setChangeListener = c -> {
try {
// do something dangerous
} catch (final IOException e) {
logger.error(e.getLocalizedMessage(), e);
}
};
を私はこのようにそれを使用したいと思います
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();
});
をエラーメッセージが
を未処理の例外である[..]
。
ここ
これは意味がありませんが、実装されていない関数を呼び出そうとします。あなたがそれを上書きするので、スーパーの機能は実装されていません。インターフェイスには1つの機能しか提供しませんが、2回使用するようにしてください。 – JohnnyAW
@JohnnyAWが同意しました。これを修正するには? – kerner1000
あなたはそれを使いたいと思う方法はありません(少なくともJavaでは、おそらく他の言語がそれを行うことができます)。あなたは 'ErrorLoggingSetChangeListener'を使用して、 – JohnnyAW