Xaxを使用してアプリケーションのデータモデルにアクセスできるようにするJaxen(JavaのXPathライブラリ)のアダプターを実装しています。
これは、文字列(Jaxenから渡された)をデータモデルの要素にマップするクラスを実装することによって行われます。合計で1000以上の文字列比較を行う約100のクラスが必要になると推定されます。
これを行う最良の方法は、各文字列を定数として定義するのではなく、コードに直接書き込まれた文字列を使用したif / elseステートメントを単純にすることだと思います。例えば:
public Object getNode(String name) {
if ("name".equals(name)) {
return contact.getFullName();
} else if ("title".equals(name)) {
return contact.getTitle();
} else if ("first_name".equals(name)) {
return contact.getFirstName();
} else if ("last_name".equals(name)) {
return contact.getLastName();
...
ただし、文字列値をコードに直接埋め込むのではなく、文字列定数を作成することを常に教えられました。これは次のようになります。
private static final String NAME = "name";
private static final String TITLE = "title";
private static final String FIRST_NAME = "first_name";
private static final String LAST_NAME = "last_name";
public Object getNode(String name) {
if (NAME.equals(name)) {
return contact.getFullName();
} else if (TITLE.equals(name)) {
return contact.getTitle();
} else if (FIRST_NAME.equals(name)) {
return contact.getFirstName();
} else if (LAST_NAME.equals(name)) {
return contact.getLastName();
...
この場合、それは悪い考えだと思います。定数は、getNode()
メソッド内で一度だけ使用されます。文字列を直接使用することは、定数を使用するのと同じくらい読みやすく理解しやすく、少なくとも1,000行のコードを書く手間を省きます。
それで、1回の使用のために文字列定数を定義する理由はありますか?または、文字列を直接使用しても問題ありませんか?
PS。代わりに列挙型を使用することを提案する前に、プロトタイプを作成しましたが、列挙型変換は単純な文字列比較よりも15倍遅いため、考慮されていません。
結論: 以下の回答は、この質問の範囲を単なる文字列定数を超えて拡大したため、2つの結論があります。
- このシナリオでは、文字列定数ではなく文字列を直接使用しても問題ありませんが、
- 文字列をまったく使用しないようにする方法があります。
そこで、文字列を完全に回避するラッパーテクニックを試します。残念ながら、まだJava 7を使用していないため、文字列switchステートメントを使用できません。ただし、最終的には、各手法を試し、そのパフォーマンスを評価することが最善の答えだと思います。現実には、1つの手法が明らかに速い場合は、その美しさや慣習の順守に関係なく、おそらくそれを選択します。
switch
ラベルとして使用できます。if
カスケードの代わりにスイッチを使用します。