我寫下面的方法的實用類(等等)有所不同:迴避javac的「曖昧」預警重載方法,只有參數拉姆達是無效或非空
class FunctionNamingUtils {
public static <T> Consumer<T> named(String name, Consumer<T> delegate) {
class NamedConsumer implements Consumer<T> {
@Override public void accept(T t) { delegate.accept(t); }
@Override public String toString() { return name; }
}
return new NamedConsumer();
}
public static <T, R> Function<T, R> named(String name, Function<T, R> delegate) {
class NamedFunction implements Function<T, R> {
@Override public R apply(T t) { return delegate.apply(t); }
@Override public String toString() { return name; }
}
return new NamedFunction();
}
}
編譯器與抱怨:
警告:JAVA: 命名(java.lang.String中,java.util.function.Consumer)在...是 與 命名(java.lang.String中,JAVA可能不夠明確。 util.function.Function)in ...
我確實得到了警告的目的 - 取決於lambda是返回一個值還是一個空值,我們將以某種方式或另一種方式返回,以及單個語句lambdas很難看清。
事情是,在這種情況下,這正是我們想要的,我想使用重載來減少必須記住兩個方法名稱的相同功能的認知負擔(我已經不得不妥協其中namedPredicate
與布爾函數衝突)。
我正在尋找任何想法 - 要麼禁止警告,要麼以不同的方式表達API。重點在於客戶端的清晰性和易用性。
我只關心Java 8+。
如果您已經與namedPredicate妥協了,那麼如果您還使用namedFunction和namedConsumer,則API會更加一致。 –
我同意JB。當然這是一個風格問題,但我經常發現**重載**方法往往會**超負荷**我的大腦。例如由於這種情況。所以我的2美分也是:只爲方法使用不同的名字。 – GhostCat
簡潔性也很重要,特別是對於原始概念。否則,你最終會得到像Spring Framework這樣的名字(沒有冒犯的意思,但我認爲它不適合公用事業)。 – ddimitrov