2016-01-13 70 views
1

那麼我被一個我創建的程序卡住了,問題是我需要(?)一種能夠應用某些車輛設置的方法,它們是隻能通過已經在API中定義的方法應用。這裏是我的代碼,以顯示該問題更加清晰:如何將未定義數量的方法作爲參數傳遞給另一個方法

applySettings(new Vehicle(), setColor(0, 0), setNumberPlate("EA3"));//An undefined number of parameters, the new Vehicle is only for this example, I will use this method in several parts of my code 
public void applySettings(Vehicle vehicleId, Vehicle settings/*?*/){ 

    } 

(車輛是一個接口,並有許多方法,其中一些是不適合的設置,我試圖與匿名類做出來,一個lambda東西叫什麼但是我不能讓它工作) 正如你所看到的,我需要傳遞未定義數量的方法(已經在API中定義)來應用車輛設置。這個我可以很容易地用做:

vehicleCreated.applySettings(); 
public void applySettings(){ 
    vehicleId.setNumerPlate("SOME"); 
    vehicleId.setColor(0, 0); 
} 

但我認爲這是錯誤的(我將不得不作出不同的組設置的幾種方法),因爲Java是一種OOPL我應該做的事情非常靈活。或者我錯了?

+5

如果'Vehicle'是一個接口,那麼'new Vehicle()'是如何工作的? –

+0

當你說「我試過用匿名類和一個叫做lambda或類似的東西來做這件事但我無法做到這一點」 - 也許你可以發佈你試過的東西並描述它是如何工作的,可能能夠幫助你。 – khelwood

+0

不是,對不起 –

回答

4

您可以創建這樣一個功能接口:

interface VehicleModifier { 
    void apply(Vehicle vehicle); 
} 

,並實現一些經典的改性劑與輔助方法:

static VehicleModifier withColor(int colorX, int colorY) { 
    return vehicle -> vehicle.setColor(colorX, colorY); 
} 

static VehicleModifier withNumberPlate(String tag) { 
    return vehicle -> vehicle.setNumberPlate(tag); 
} 

然後改變你的方法是這樣的:

public void applySettings(Vehicle vehicleId, VehicleModifier... modifiers){ 
    Stream.of(modifiers).forEach(modifier -> modifier.apply(vehicleId)); 
} 

您現在可以致電:

applySettings(new Vehicle(), withColor(0, 0), withNumberPlate("EA3")); 
+0

非常好。我認爲反思將是嚴格執行OP的唯一選擇,並完全忘記了lambdas。 –

0

我會改變設計使用流利的生成器模式。

class VehicleBuilder { 
    private String plateNumber; 
    // add state properties... 

    public VehicleBuilder setPlateNumber(String plateNumber) { 
     this.plateNumber = plateNumber; 
     return this; 
    } 

    // add setters for other properties... 

    public Vehicle build() { 
     return new Vehicle(plateNumber, ...); 
    } 
} 

然後構建一個與車輛:

Vehicle v = new VechicleBuilder().setPlateNumber("123").setColor(RED).build(); 

如果你真的需要傳遞方法作爲參數,它需要反思和將非常醜陋而且難以維護。編輯:@Prim顯示如何用lambdas做到這一點,所以反射並不需要。

相關問題