2017-08-24 56 views
1

我想爲我的應用程序中使用的不同對象創建一個持有者類,我最終得到的代碼在某種程度上正常工作,生成器模式對於可選字段,但我想這保持器可以被重構爲接受任何任意數目的參數如何爲持有人正確使用泛型

package pojos; 

public class Holder<T, R, S, U> { 
private final T t; 
private final R r; 

private final S s; 
private final U u; 


private Holder(final Builder<T, R, S, U> builder) { 
    this.t = builder.t; 
    this.r = builder.r; 
    this.s = builder.s; 
    this.u = builder.u; 
} 


public T getField1() { 
    return this.t; 
} 

public R getField2() { 
    return this.r; 
} 

public S getField3() { 
    return this.s; 
} 

public U getField4() { 
    return this.u; 
} 


public static class Builder<T, R, S, U> { 
    private T t; 
    private R r; 
    private S s; 
    private U u; 


    public Builder field1(final T t) { 
     this.t = t; 
     return this; 
    } 

    public Builder field2(final R r) { 
     this.r = r; 
     return this; 
    } 

    public Builder field3(final S s) { 
     this.s = s; 
     return this; 
    } 

    public Builder field4(final U u) { 
     this.u = u; 
     return this; 
    } 

    public Holder<T, R, S, U> build() { 
     return new Holder<>(this); 
    } 

    public Builder<T, R, S, U> copy(final Holder<T, R, S, U> rowMappingsHolder) { 
     this.t = rowMappingsHolder.getField1(); 
     this.r = rowMappingsHolder.getField2(); 
     this.s = rowMappingsHolder.getField3(); 
     this.u = rowMappingsHolder.getField4(); 
     return this; 
    } 


} 

}使用的

實施例:

protected Holder<Row, Map<Integer, String>, Void, Void> getRowMapHolder(Row row, Map<Integer,String> map) { 
    return (Holder<Row, Map<Integer, String>, Void, Void>) new Holder.Builder<Row, Map<Integer, String>,Void, Void>().field1(row).field2(map).build(); 
} 

任何ID EAS?

問候

〜馬爾科

+0

「任意數量的參數」這些參數是相同類型的嗎? –

+0

不,您可以看到持有者可以包含不同類型的對象,請參閱「使用示例」僅使用前兩個,一個持有類型「Row」,第二個持有類型爲「Map」的對象,因此這裏的問題是如何創建一個持有者,我們可以傳遞多個類型並按照他們在Holder中插入的順序檢索它們,因此不再需要「field1」,「field2」... –

+0

如果您沒有顯式結構/您想要維護的值的集合,僅使用Map或Set作爲持有者會更容易,並且如果有關該持有者的內容格式錯誤(丟失了所需的參數或其他內容),則拋出無效的參數異常 – Tezra

回答

0

感謝Andy的評論和谷歌Autovalue,很好的解決出現了:

因此,我們可以創建一個具有意義不同類別,沒有更多的「字段1」,「字段2」 ......

package pojos; 

import com.google.auto.value.AutoValue; 
import org.apache.poi.ss.usermodel.Row; 

import java.util.Map; 

@AutoValue 
public abstract class RowMapHolder { 

    public abstract Row row(); 

    public abstract Map<Integer,String> mapping(); 

    public static RowMapHolder create(Row row, Map<Integer, String> mapping) { 
     return new AutoValue_RowMapHolder(row, mapping); 
    } 

} 

package pojos; 

import com.google.auto.value.AutoValue; 

import java.util.List; 
import java.util.Map; 

@AutoValue 
public abstract class KeyValuesMapHolder { 

    public abstract List<KeyValue<String,String>> keyValues(); 
    public abstract Map<Integer,String> mapping(); 

    public static KeyValuesMapHolder create(List<KeyValue<String, String>> keyValues, Map<Integer, String> mapping) { 
     return new AutoValue_KeyValuesMapHolder(keyValues, mapping); 
    } 

} 
1

應如何針對不同數量的參數工作?您的訪問者數量有限,因此,如果您未聲明,則無法使用,例如h.getField2147()

不同數量的對象具有元組的另一種方法是異構數組。在Java中,OFC,你可能只需要使用Object[],你可以用類,它有方法

public <T> T getField(int i) { 
    return (T) arr[i]; 
} 

,然後使用像h.<String>getField(2147)

但是,創造不同類別的不同大小的元組(如您的包裹它4個物體)更好。