私が取り組んでいるプロジェクトは、最近Java 7からJava 8に切り替えました。機能ベースのインタフェースをコードベースに導入する候補として、抽象メソッドを1つしか持たないインタフェースを探したいと思います。 (既存のインターフェイスに@FunctionalInterface
と注釈を付け、java.util.function
のインターフェイスから拡張するか、または単にそれらを置き換えるだけです)。Javaコードベースで単一のメソッドを持つインタフェースを検索するにはどうすればよいですか?
答えて
reflectionsプロジェクトは、クラスパス上のすべてのクラスを見つけて返すことができます。
ReflectionUtils.forNames(new Reflections(new ConfigurationBuilder().setScanners(new SubTypesScanner(false))
.addUrls(ClasspathHelper.forClassLoader()))
.getAllTypes()).stream()
.filter(Class::isInterface)
.collect(toMap(c -> c,
c -> Arrays.stream(c.getMethods())
.filter(m -> !m.isDefault())
.filter(m -> !Modifier.isStatic(m.getModifiers()))
.filter(m -> !isObjectMethod(m))
.collect(toSet())))
.entrySet().stream()
.filter(e -> e.getValue().size() == 1)
.sorted(comparing(e -> e.getKey().toString()))
.map(e -> e.getKey().toString() + " has single method " + e.getValue())//getOnlyElement(e.getValue()))
.forEachOrdered(System.out::println);
isObjectMethod
ヘルパーは、このように定義されています:
private static final Set<Method> OBJECT_METHODS = ImmutableSet.copyOf(Object.class.getMethods());
private static boolean isObjectMethod(Method m){
return OBJECT_METHODS.stream()
.anyMatch(om -> m.getName().equals(om.getName()) &&
m.getReturnType().equals(om.getReturnType()) &&
Arrays.equals(m.getParameterTypes(),
om.getParameterTypes()));
}
これは、あなたが戻ってソースコードに戻り、注釈を追加助けにはならないが、それはあなたを与えるだろうここで働い例です仕事のリスト。
インタフェースが 'Object'のメソッドをオーバーライドすると、' Comparator'のようにどうなりますか?次に、メソッドをフィルタリングする必要があります。また、 'static'メソッドも取り除かなければなりません。あるいは、フィルターが '抽象'メソッドだけを渡すようにしてください。 'Arrays.stream(c.getMethods()) 'の代わりに' stream(spliterator(c.getMethods()、0)、false) 'を使う理由がありますか? – Holger
あなたのコメントで更新されました –
'.filter(m - >!m.isDefault())の代わりに' .filter(m - > Modifier.isAbstract(m.getModifiers() Modifier.isStatic(m.getModifiers())) '? – Holger
- 1. Javaで類似の単語やフレーズを検索するにはどうすればよいですか?
- 2. CloudKitレコードの一部の単語を検索するにはどうすればよいですか?
- 3. WPFで単一のスナップポイントを持つSliderコントロールを作成するにはどうすればよいですか?
- 4. Elasticsearchで同じ親IDを持つ子ドキュメントを検索するにはどうすればよいですか?
- 5. Javaで一意のキーを持つHashMapを使用するにはどうすればよいですか?
- 6. 特定の依存関係を持つプロジェクトを検索するにはどうすればよいですか?
- 7. リスト内の属性を持つ要素を検索するにはどうすればよいですか?
- 8. インタフェースと一緒に「次世代」Javaデータオブジェクトスタイルを使用するにはどうすればよいですか?
- 9. アイテム値を持つリストボックスアイテムインデックスを検索するにはどうすればよいですか?
- 10. 検索の一部と一致するレコードを取得するにはどうすればよいですか?
- 11. 単語検索パズル:単語の検索のために文字の配列を検索するにはどうすればよいですか?
- 12. PHPでhtmlタグの間にある単語を検索するにはどうすればよいですか?
- 13. URLの一部ではないテキストを検索するにはどうすればよいですか?
- 14. ルビーカピバラで単一の検索を使用して複数のロケータを検索するにはどうすればよいですか?
- 15. ウェブサイトでファイルを検索するにはどうすればよいですか?
- 16. jsonでjsonを検索するにはどうすればよいですか?
- 17. アンドロイドアプリケーションでスタックアクティビティを検索するにはどうすればよいですか?
- 18. mysqlでレコードを検索するにはどうすればよいですか?
- 19. eclipseでライブラリを検索するにはどうすればよいですか?
- 20. PerlでCSSを検索するにはどうすればよいですか?
- 21. LuceneでDBを検索するにはどうすればよいですか?
- 22. Stack.PHPでスタックオーバーフローを検索するにはどうすればよいですか?
- 23. 検索バーで実際にサイト内のページを検索するにはどうすればよいですか?
- 24. 一部のテキストですべてのGuidを検索するにはどうすればよいですか?
- 25. ajaxの検索をエミュレートするにはどうすればよいですか?
- 26. ウェブサイトのトピックを検索するにはどうすればよいですか?
- 27. アイテムのArrayListを検索するにはどうすればよいですか?
- 28. 単語ファイルの検索でエラーを解決するにはどうすればよいですか?
- 29. Googleの検索結果でURLの出現を検索するにはどうすればよいですか?
- 30. 異なるテキストビューで同じ単語を検索するにはどうすればよいですか?
これはIntelliJでの検査として利用できます。この検査のみを持つ検査プロファイルを作成し、プロジェクトで実行します。 –
この変更には、ケースバイケースの分析が必要であり、アノテーションを追加するだけでなく、他の2つのソリューションはいずれも大幅なリファクタリングを必要とします。ライブラリを設計していない場合、ランダの実装をしている間にインターフェイスを非機能的なものに変換すると、コンパイルの問題がすぐに表示されるため、注釈を追加するだけでは大きな価値はありません。 –