String
はJavaの特殊なケースです。これは、 ソースコード で調べることができるクラスですが、独自の中置演算子+
もあります。これは、StringBuilder
の構文糖衣のようです。
例えば、
"Hello " + yourName;
になる可能性があります
new StringBuilder().append("Hello ").append(yourName).toString();
Javaにはユーザー定義の演算子がないので、String
に+
を指定する場所はどこですか?
同じメカニズムを使用して、ベクトルなどの追加の演算子を作成できますか?
_+
_はJava compilers。コンパイラreplacesString
+ String
に実装されています。 コンパイル時定数またはStringBuilder
コードのいずれかを使用します。これはプリミティブにも適用されることに注意してください。つまり、_int i=1+2
_は_int i=3
_コンパイル自体中。
仕様で確認できます。コンパイラには、Javaソースコードではなく、実装されています。
Java Language Specification- 15.18.1. String Concatenation Operator +
実装は、中間のStringオブジェクトを作成して破棄することを回避するために、変換と連結を1つのステップで実行することを選択できます。繰り返される文字列連結のパフォーマンスを向上させるために、Javaコンパイラは、StringBufferクラスまたは同様の手法を使用して、式の評価によって作成される中間Stringオブジェクトの数を減らすことができます。
これは、実装がコンパイラに依存しているという証拠を示しています。
現在、ほとんどのJavaコンパイラはStringBuilder
チェーンを使用していますが、常にこのようにする必要があるとは指定されていません。特に、変更する 提案 があります。これはJava-9で大幅に置き換えられ、単一のinvokedynamic
呼び出しに置き換えられ、連結を実行するために実行時に適切なMethodHandle
を生成する新しいメタファクトリが導入されます。
言語に関しては、いいえ、それは拡張可能ではありません。これは特定の動作であり、他のクラスは+
演算子を拡張しません。
これが行われる場所については、次のファイルで string_add
(実際のJVM操作ではありません) を検索してください。
理由については、Javaは単純であるか、少なくともC++よりも単純であると想定されており、文字列操作などの基本的なことは一種の必須でした。ただし、演算子のオーバーロードは複雑さを増します。