私は様々なプロパティを持つクラスを持っており、より簡単にそれらの周りをループするためにそれらの周りにラッパーメソッドを記述したいと思います。メソッドは、コレクションまたは単一の値を返します
一部のプロパティは、のコレクションの値を返します。単一のの値を返します。そして、私はこれに最善のアプローチを探しています。
私の最初のアプローチは、getterが返すプロパティをラッパーメソッドが返すようにすることです。
public class Test {
public Object getValue(String propName) {
if ("attr1".equals(propName)) return getAttribute1();
else if ("attr2".equals(propName)) return getAttribute2();
else return null;
}
public List<String> getAttribute1() {
return Arrays.asList("Hello","World");
}
public String getAttribute2() {
return "Goodbye";
}
public static void main(String[] args) {
final Test test=new Test();
Stream.of("attr1","attr2")
.forEach(p-> {
Object o=test.getValue(p);
if (o instanceof Collection) {
((Collection) o).forEach(v->System.out.println(v));
}
else {
System.out.println(o);
}
});
}
}
このアプローチの悪い点は、呼び出し元が結果がコレクションであるかどうかを自分でテストする必要があることです。
呼び出し側にとってシームレスな他のアプローチは、常にコレクションを返します。ラッパー関数は単一の値をCollectionにラップします。ここではHashSetですが、最小限の1つの要素リストを想定することができます。
public class TestAlt {
public Collection getValue(String propName) {
if ("attr1".equals(propName))
return getAttribute1();
else if ("attr2".equals(propName)) {
Set s = new HashSet();
s.add(getAttribute2());
return s;
}
else
return null;
}
public List<String> getAttribute1() {
return Arrays.asList("Hello", "World");
}
public String getAttribute2() {
return "Goodbye";
}
public static void main(String[] args) {
final TestAlt test = new TestAlt();
Stream.of("attr1", "attr2")
.forEach(p -> {
test.getValue(p).forEach(v -> System.out.println(v));
});
}
パフォーマンス面では、設計上、...これらのアプローチについてのあなたの意見は?より良いアイデアはありますか?
推測=アイテムが1つしか入っていないコレクションはありますか? – Marichyasana
すべての値を印刷しようとしていますか?他の目的はありませんか?また、型は常に 'List'と 'String'のいずれかになりますか? 'int'のような他の型もありますか? –
Sweeper
@Marichyasana 1つのアイテムだけを持つコレクションは簡単に書き込み可能です – lvr123