web-dev-qa-db-ja.com

(String)または.toString()?

_Object o_パラメーターを持つメソッドがあります。

このメソッドでは、「o」にnullではないStringがあることを正確に知っています。チェックしたり、他のことをする必要はありません。 Stringオブジェクトとまったく同じように扱わなければなりません。

好奇心が強い-何が安い-Stringにキャストするか、Object.toString()を使用しますか?または、time-/cpu-/mem- priceで同じですか?

更新:メソッドは、インターフェイスの実装であるため、Objectを受け入れます。パラメータタイプを変更する方法はありません。

nullにはできません。 nullまたはemptynessをチェックする必要はないと言いたいだけです。私の場合、空ではない文字列が常にあります。

83
Vugluskr

文字列へのキャストは安価です外部関数呼び出しを必要とせず、内部型チェックのみを必要とします。

66
euphoria83

キャストを使用します。これは、文字列であるという「知識」を検証します。何らかの理由でバグが発生し、誰かが文字列以外の何かを渡した場合、欠陥のあるデータを実行し続けるよりも例外をスローする方が良いと思います(キャストが行います)。

45
Jon Skeet

Silly performance musings:x.toString()vs(String)x によると

最後に、結果は驚くほど明確です:Object.toString()を呼び出すよりもObjectをStringにキャストする方が少なくとも2倍高速です

34
cletus

Object oが文字列であることがわかっている場合は、文字列にキャストして、そのように強制するだけです。確かにStringであることがわかっているオブジェクトでtoString()を呼び出すと、混乱が生じる可能性があります。

Object oがString以外の場合、toString()を呼び出す必要があります。

7
Andy White

この操作が1秒間に数千回行われたとしても、パフォーマンスにはあまり関心がありません-目に見える違いはありません。

しかし、私は入力を「知る」ことに関心があるでしょう。 Objectを受け入れるメソッドがあり、そのように扱う必要があります。つまり、toString()メソッドを持っているObjectインターフェイスに準拠している以外は、パラメータについてknowしてはいけません。この場合、単に何かを仮定するのではなく、その方法を使用することを強くお勧めします。

OTOH、入力がalwaysStringまたはnullの場合、メソッドを変更してStringsを受け入れ、nullsを明示的に確認します(非プリミティブを扱うときはいつでも行う必要があります...)

3
Henrik Paul

「oにヌル文字列」は存在できません。 oがnullの場合、null文字列は含まれず、nullになります。最初にnullのoをチェックするだけです。もし、あんたが キャスト または、nullでToString()を呼び出すとクラッシュします。

1
Ed S.

参照型がオブジェクトであり、すべてのオブジェクトにtoString()がある場合、object.toString()を呼び出すだけです。 String.toString()はこれを返すだけです。

  • toString()は入力するコードが少なくなります。
  • toString()はバイトコードが少ないです。
  • キャストはコストのかかる操作であり、多態的な呼び出しです。
  • キャストが失敗する可能性があります。
  • Nullではない場合にobject.toString()を呼び出すString.valueOf(object)を使用します。
1
mP.

「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();
}
1
TofuBeer

奇妙なことに、キャストはtostring呼び出しで暗示されるvtableルックアップよりも遅いことがわかりました。

1
Joshua