2

独自のStringクラスを実装し、二重引用符を使用しているときにJavaで使用できるようにしたいと思います。
次のようにMyString s = "foo"なります。java.lang.Stringはインスタンス化されません。

コンパイラに触れることなくそれは可能ですか?
それはどのように行われますか?

私が尋ねている理由は、最悪の場合の実行時間について検証する必要があるプログラムに文字列が必要だからです。それを検証するには、すべてのループを制限する必要があります(制限はコメントで指定されます)。MyString s = new MyString({'f','o','o'})さらに、書くと読みやすさが大幅に低下するため、便宜上二重引用符を使用できるようにしたいと思います。

4

4 に答える 4

3

コンパイラに触れない限り、それは不可能です。

Stringをサブクラス化することさえできません。(あなたはあなた自身の実装を提供することしかできませjava.lang.ChareSequenceんが、これはあまり役に立ちません。)

于 2011-01-18T10:04:16.290 に答える
3

Stringクラスを置き換えることができます。Stringのソースを取得し、すべてのメソッドシグネチャを同じに保ちながら変更し、コンパイルして、bootclasspathに追加します。注:これにより、コード内の文字列だけでなく、すべての文字列が置き換えられます。また、使用ライセンスに準拠していない場合もあります。;)

読みやすさが心配な場合は、次のようなヘルパーメソッドを作成できます。

MyString s = s("Hello");

アプリケーションの速度を落とすだけの場合は、次のような多くのことを実行できます。

  • あなたが見つけることができる最も遅いマシンを使用してください。eBayには安いものがたくさんあります。
  • JITを無効にします。
  • デバッグを有効にします。
  • プロファイリングを有効にし、すべてのメソッド呼び出しとオブジェクト作成を追跡します。
于 2011-01-18T10:25:48.270 に答える
2

たとえば、ASMのようなフレームワークを使用して、Stringを使用するすべての場所でMyStringを使用するように実行時にバイトコードを変更するなど、非常に複雑なソリューションを探すことができますが、幸運を祈ります。

http://asm.ow2.org/

別の方法で同じ結果を得ようとする方がおそらく良い考えです...

于 2011-01-18T10:06:25.147 に答える
2

ストリンガーリテラルは一度だけインスタンス化されるため、時間のコストについて心配する必要はありません。

MyString s = new MyString("foo")

それはあなたの目的には問題ありません。Stringのインスタンスは1つだけ"foo"作成されます。(複数のソースファイルに"foo"リテラルが含まれている場合でも)。まるで

static private final String $foo = JVM.findOrCreateString('f','o','o');
...
MyString s = new MyString($foo);
于 2011-01-18T10:26:37.263 に答える