==
インターンされた文字列での使用に2セントを追加したいと思います。
最初に行うことString.equals
はですthis==object
。
したがって、パフォーマンスはわずかに向上しますが(メソッドを呼び出さない場合)、メンテナの観点からは==
、一部のインターンされた文字列は非インターンになる傾向があるため、を使用することは悪夢です。
==
したがって、インターン文字列の特殊なケースに依存するのではなく、常にequals
ゴスリングが意図したとおりに使用することをお勧めします。
編集:インターンが非インターンになる:
V1.0
public class MyClass
{
private String reference_val;
...
private boolean hasReferenceVal ( final String[] strings )
{
for ( String s : strings )
{
if ( s == reference_val )
{
return true;
}
}
return false;
}
private void makeCall ( )
{
final String[] interned_strings = { ... init with interned values ... };
if ( hasReference( interned_strings ) )
{
...
}
}
}
バージョン2.0では、メンテナはhasReferenceVal
、インターンされた文字列の配列を期待していることをあまり詳しく説明せずに、公開することを決定しました。
V2.0
public class MyClass
{
private String reference_val;
...
public boolean hasReferenceVal ( final String[] strings )
{
for ( String s : strings )
{
if ( s == reference_val )
{
return true;
}
}
return false;
}
private void makeCall ( )
{
final String[] interned_strings = { ... init with interned values ... };
if ( hasReference( interned_strings ) )
{
...
}
}
}
これでバグが発生しましたが、ほとんどの場合、配列にはリテラル値が含まれており、リテラル以外の文字列が使用されることもあるため、見つけるのは非常に難しい場合があります。equals
代わりに使用された==
場合でもhasReferenceVal
、引き続き機能します。繰り返しになりますが、パフォーマンスの向上はごくわずかですが、メンテナンスコストは高くなります。