2011-07-13 25 views
10

シンプルなデザインの質問です。なぜToBinaryStringはIntegerクラスのインスタンスメソッドではありませんか?

サンプルコード:

Integer int1 = new Integer(20);  
    System.out.println(Integer.toBinaryString(int1)); 

JDKの設計は、次のようなものではないのはなぜ?したがって、toBinaryString関数は、の結果を返しますか?静的関数の汎用性のために別に

System.out.println(int1.toBinaryString()); 

、この設計アプローチのための他の理由が何ですか?彼らは特定のデザインパターンを使用していますか?それでは、どのパターン?

答えて

9

サンプルコードでは、Integerのインスタンスが作成され、そのボックスからボックスが解除されます。そのための必要はありません:

int int1 = 20; 
String binary = Integer.toBinaryString(int1); 

それはインスタンスメソッドであれば、あなたはが単独intは迷惑だろうそのバイナリ表現に変換するIntegerのインスタンスを作成するためにを余儀なくされるだろう。

つまり、オブジェクトを不必要に作成しないようにする。

+0

*明示的にオブジェクトを不必要に作成しないようにするには、いいえ? Autoboxingはどちらの場合でも本質的に同一のバイトコードを作成することになります。(今、ホットスポットはオブジェクトの作成を完全に削除するかもしれませんが、再び両方の場合に等しく適用されます)。または私は何かを逃していますか? –

+0

@ jon-skeetは単に 'int'型が存在しないと言うことができます。次に、このデザインパターンの背後にある理由は何でしょうか? –

+1

Andrzej:いいえ、autoboxingはありません。パラメータには整数型ではなくint型であるためです。 –

15

これは、静的なメソッドと静的なメソッドの2つのメソッドを同じ名前で持つことができないためです。同じ機能の2つの異なるメソッド名をもう一度持つことは混乱していたでしょう。

この場合、バイナリ表現を取得する前にintをIntegerに "ラップする"必要はなく、両方の目的(バイナリ文字列intおよびInteger)を処理するので、 。

+0

私はそれを知っています。私の質問は、なぜjdkがこのように設計されているかです。 –

+0

私はすでにそれに答えました。 'int 'を' Integer'にラップする必要はなく、クラス内に同じメソッドを2つ(静的と静的ではない)持つことを防ぐためです。 –

+0

+1私はこれが答えだと思っています。なぜなら、 'int'はオブジェクトではありませんが、オートボクシングではメソッドに渡されたときに自動ボクシングを行うことができます。 'Integer.toBinaryString(42)'はコンパイルされますが、 '42.toBinaryString()'はコンパイルされません。 –

6

戻るこのメソッドが追加されたとき、JDK1.0.2ではオートボクシングは行われず、JVMは現在よりもはるかに低速でした。この静的メソッドを使用すると、intとIntegerの両方をバイナリ文字列に簡単に変換でき、intをバイナリに変換するためだけに新しいIntegerインスタンスを作成する必要はありません。

0

int、char、double ...これらはデフォルトのデータ型です。これらはオブジェクトではありません。メソッドは、オブジェクトではないデータ型の一部でなければなりません。

このような静的メソッドは、インスタンスメソッドより効率的です。

関連する問題