_Object o
_パラメーターを持つメソッドがあります。
このメソッドでは、「o」にnullではないString
があることを正確に知っています。チェックしたり、他のことをする必要はありません。 String
オブジェクトとまったく同じように扱わなければなりません。
好奇心が強い-何が安い-String
にキャストするか、Object.toString()
を使用しますか?または、time-/cpu-/mem- priceで同じですか?
更新:メソッドは、インターフェイスの実装であるため、Object
を受け入れます。パラメータタイプを変更する方法はありません。
null
にはできません。 nullまたはemptynessをチェックする必要はないと言いたいだけです。私の場合、空ではない文字列が常にあります。
文字列へのキャストは安価です外部関数呼び出しを必要とせず、内部型チェックのみを必要とします。
キャストを使用します。これは、文字列であるという「知識」を検証します。何らかの理由でバグが発生し、誰かが文字列以外の何かを渡した場合、欠陥のあるデータを実行し続けるよりも例外をスローする方が良いと思います(キャストが行います)。
Silly performance musings:x.toString()vs(String)x によると
最後に、結果は驚くほど明確です:Object.toString()を呼び出すよりもObjectをStringにキャストする方が少なくとも2倍高速です
Object oが文字列であることがわかっている場合は、文字列にキャストして、そのように強制するだけです。確かにStringであることがわかっているオブジェクトでtoString()を呼び出すと、混乱が生じる可能性があります。
Object oがString以外の場合、toString()を呼び出す必要があります。
この操作が1秒間に数千回行われたとしても、パフォーマンスにはあまり関心がありません-目に見える違いはありません。
しかし、私は入力を「知る」ことに関心があるでしょう。 Object
を受け入れるメソッドがあり、そのように扱う必要があります。つまり、toString()
メソッドを持っているObject
インターフェイスに準拠している以外は、パラメータについてknowしてはいけません。この場合、単に何かを仮定するのではなく、その方法を使用することを強くお勧めします。
OTOH、入力がalwaysString
またはnull
の場合、メソッドを変更してString
sを受け入れ、null
sを明示的に確認します(非プリミティブを扱うときはいつでも行う必要があります...)
「oにヌル文字列」は存在できません。 oがnullの場合、null文字列は含まれず、nullになります。最初にnullのoをチェックするだけです。もし、あんたが キャスト または、nullでToString()を呼び出すとクラッシュします。
参照型がオブジェクトであり、すべてのオブジェクトにtoString()がある場合、object.toString()を呼び出すだけです。 String.toString()はこれを返すだけです。
「o」にあるものが文字列である場合、違いはあまりありません(おそらくキャストは高速ですが、それはVM/Library実装の問題です)。
"o"が文字列ではないかもしれないが、文字列であると想定される場合、キャストは望みのものです(ただし、メソッドではオブジェクトではなく文字列を使用する必要があります)。
「o」が任意の型である場合、toStringを使用する必要がありますが、最初に必ずnullを確認してください。
void foo(final Object o)
{
final String str;
// without this you would get a class cast exception
// be wary of using instanceof though - it is usually the wrong thing to do
if(o instanceof String)
{
str = (String)o;
}
}
または
void foo(final Object o)
{
final String str;
// if you are 100% sure that o is not null then you can get rid of the else
if(o != null)
{
str = o.toString();
}
}
私はむしろ最後のものを次のようにコーディングしたい:
void foo(final Object o)
{
final String str;
if(o == null)
{
throw new IllegalArgumentException("o cannot be null");
}
str = o.toString();
}
奇妙なことに、キャストはtostring呼び出しで暗示されるvtableルックアップよりも遅いことがわかりました。