#拡張メソッドとは何ですか?
拡張メソッドとは、既存の型にメソッドを直接「追加」する機能です。新しい派生型の作成、再コンパイル、または既存の型の変更。拡張メソッドを呼び出す場合、型で実際に定義されたメソッドを呼び出す場合と比べて、目立った違いはありません。
拡張メソッドが必要な理由
この機能の実装を検討してください。Redis から複数のプロダクト ID を含む文字列 (各プロダクト ID は英語のカンマで区切られています) を取り出した後、最初にプロダクト ID を比較します。重複を削除し (要素の順序を維持し)、最後にカンマを使用して製品 ID を接続します。
従来の書き込みメソッド:
ストリーム書き込みメソッドを使用:
拡張メソッドは Java で実装できると仮定し、配列の拡張メソッドを List に追加します (配列を List に変換)、List の拡張メソッド toSet (List を LinkedHashSet に変換)、および Collection の拡張メソッド join (指定されたコネクタを使用してコレクション内の要素の文字列形式を接続する) を追加すると、次のことが可能になります。次のようなコードを記述します:
この時点で拡張メソッドが必要な理由についてはすでに答えがあると思います:
ツール クラスを使用する代わりに、既存のクラス ライブラリを直接拡張できます
比較 ツール クラスを使用し、その型自体のメソッドを使用してコードをよりスムーズかつ快適に記述します。
静的メソッドのネスト ドールを使用するのではなくチェーン呼び出しであるため、コードが読みやすくなります
Java 拡張メソッドでの実装方法
まず、最近人気のある ChatGPT について聞いてみましょう:
ChatGPT の見解は、Java では次のとおりです。拡張メソッドは、静的メソッドによって実装されたツール クラスを通じて提供されます。次に、まったく新しいブラック テクノロジを紹介します。
Manifold
準備条件
Manifold と Lombok は同様に機能し、どちらも処理されるアノテーション プロセッサを通じてコンパイルされます。 Manifold を効果的に使用するには、IDEA
に Manifold IDEA プラグインをインストールし、プロジェクト pom:
の maven-compiler-plugin に annotationProcessorPaths を追加する必要があります。プロジェクト内の Lombok は、annotationProcessorPaths に追加する必要があります。
拡張メソッドの記述
JDK では、String の Split メソッドはパラメーターとして文字列を使用します。つまり、String[] Split です。 (弦)。次に、拡張メソッド String[] Split(char) を String: Split by Givencharacters に追加しましょう。
Manifold に基づいて拡張メソッドを作成します:
本質的にツール クラスである静的メソッドを見つけることができますが、いくつかの要件があります:
ツール クラスは Manifold の @ を使用する必要があります。拡張子の注釈
静的メソッドでは、ターゲット型のパラメータに @This の注釈を付ける必要があります
ツール クラスが配置されているパッケージ名は拡張子で終わる必要があります。完全修飾クラス対象の型の名前
——C#を使ったことのある学生なら思わずニヤリとしてしまうかもしれませんが、これはC#を模倣した拡張方法です。
ポイント 3 に関して、この要件の理由は、Manifold がプロジェクト内の拡張メソッドを迅速に見つけ、プロジェクト内のすべてのクラスの注釈スキャンを回避し、処理効率を向上させることを望んでいることです。
メソッドを拡張できるようになったので、次のように呼び出すことができます:
素晴らしい!そして、 System.out.println(numStrs.toString()) が実際には配列オブジェクトのアドレスではなく、配列オブジェクトの文字列形式を出力していることがわかります。逆コンパイルされた App.class を参照し、拡張メソッド呼び出しが静的メソッド呼び出し
に置き換えられ、配列の toString メソッドが Manifold を使用して配列拡張機能を定義していることを確認します。 Method ManArrayExt.toString(@This Object array):
[Ljava.lang.String;@511d50c0 何、さようなら、二度と会わないね~
Manifold の拡張メソッドを使用すると、拡張メソッドの呼び出しはコンパイル時に静的メソッドの呼び出しに置き換えられるため、呼び出しメソッドのオブジェクトが null であっても、処理されたコードは対応する静的メソッドにパラメーターとして null を渡すため、問題はありません。たとえば、コレクションを拡張するには:
その後、呼び出し時:
java.lang.NullPointerException、さようなら、二度と会うことはありません~
配列拡張メソッド
List は次のように記述されています: @Self は、注釈付きの値がどのような型であるかを示すために使用されます。@Self の場合、つまり @Self(false) は、注釈付きの値。値は @This 注釈の値と同じ型です。@Self(true) は配列内の要素の型を示します。
オブジェクト配列の場合、toList メソッドが対応するリスト (T は配列要素の型) を返すことがわかります。元の Type 配列、IDEA によって示される戻り値は次のとおりです:
しかし、私は Java を使用しています。消去メソッド ジェネリックスに List のような優れた機能があるのはなぜですか - それで、次のようになります。この戻り値を受け取るには、ネイティブ型のみを使用してください:)
##—— Project Valhalla がすぐにリリースされることを願って願います。
さまざまなプロジェクトで、誰もが最初にオブジェクトを Optional にパッケージ化し、次にフィルターやマップなどを実行することがよくあります。 @Self の型マッピングを使用すると、次のように非常に実用的なメソッドを Object に追加できます。
これにより、すべてのオブジェクトが asOpt() メソッドを持つようになります。
以前は不自然にラップする必要があったのに比べて:
今では Optional を自然に使用できるようになりました:
もちろん、Object はすべてのクラスの親クラスなので、依然としてそれを行うことが適切かどうかを慎重に検討する必要があります。
拡張静的メソッド
Java9 がコレクションにファクトリ メソッドを追加していることは誰もが知っています:
羨ましいですか? Java 9 以降を使用していない場合 (Java 8: ID カードを見せてください)、Guava のようなライブラリを使用する必要がありますが、ImmutableList.of は使用されている List.of ほど優れていません。 。
それは問題ではありません、マニホールドは言いました:「それは問題ではありません、私は行動を起こします。」 Manifold に基づいて静的メソッドを拡張するには、拡張クラスの静的メソッドに @Extension を追加します。
そうすれば、Java8 以降のバージョンを使用するように自分を騙すことができます。やりたいことは何でもできます。私は Java8 を使用しています。
ところで、Object はすべてのクラスの親クラスであるため、静的拡張メソッドを Object に追加すると、インポートすることなくどこからでもこの静的メソッドに直接アクセスできるようになります。おめでとうございます。ロックが解除されました。 「トップ機能」。
以上がJava に不足している機能拡張メソッドは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。