我有兩個類似的課程,Foo 和 Bar
public class Foo{
private String name;
public Foo(String name){
this.name = name;
}
}
public class Bar{
private String name;
public Bar(String name){
this.name = name;
}
}
而且我在另一個類中有兩個方法,它們創建了一組 Foo (第一種方法)和 Bar (第二種方法),并且幾乎相同。第一個:
private Set<Foo> buildFoos(final List<String> names)
{
final Set<Foo> set = new HashSet<>();
for (int i = 0; i < names.size(); i )
{
set.add(new Foo(names.get(i)));
}
return set;
}
第二個:
private Set<Bar> buildBars(final List<String> names)
{
final Set<Bar> set = new HashSet<>();
for (int i = 0; i < names.size(); i )
{
set.add(new Bar(names.get(i)));
}
return set;
}
如您所見,這兩種方法幾乎相同,所以我想我可以使用泛型來僅使用一種方法。我的方法是這樣的:
private <T> Set<T> build(final Class<T> clazz, final List<String> names)
{
final Set<T> set = new HashSet<>();
for (int i = 0; i < names.size(); i )
{
set.add(clazz.getConstructor(String.class).newInstance(names.get(i)));
}
return set;
}
我已經對此進行了測驗,它應該可以作業,但我的問題是,如果 Foo 或 Bar 有不同的建構式會發生什么(例如, Bar 會有另一個 String 作為第二個引數)。我能想到的就是檢查類的實體并選擇兩個建構式之一(像這樣)
private <T> Set<T> build(final Class<T> clazz, final List<String> names)
{
final Set<T> set = new HashSet<>();
for (int i = 0; i < names.size(); i )
{
if(clazz.isInstance(Foo.class){
set.add(clazz.getConstructor(String.class).newInstance(names.get(i)));
}
else if(clazz.isInstance(Bar.class){
set.add(clazz.getConstructor(String.class, String.class).newInstance(names.get(i), "example"));
}
}
return set;
}
有沒有更好的方法來實作這一目標?這甚至是一個好習慣嗎?任何提示總是值得贊賞的。提前致謝!
uj5u.com熱心網友回復:
在我看來,最好采用 aFunction<String, T>而不是 a Class<T>。這樣你就不需要反射了,呼叫者可以傳入建構式、工廠方法、使用多引數建構式的 lambda,無論他們想要什么。所以你的方法是:
private <T> Set<T> build(final Function<String, T> factory, final List<String> names) {
final Set<T> set = new HashSet<>();
for (String name : names) {
set.add(factory.apply(name));
}
return set;
}
我懷疑這可以使用流更簡單地撰寫,但這是一個單獨的問題。(不過,為了簡單起見,我確實借此機會使用了增強的 for 回圈。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/460206.html
