2016-10-26 43 views
4

我探索在Java引入了8Java8使用界面的默認方法枚舉值

我已經有2個默認的方法是做構建命令的接口,我跑靜態和默認方法的可能性服務器通過ssh遠程執行一些簡單的任務。移動鼠標需要2個參數:鼠標的x和y位置。

public interface Robot { 

    default String moveMouse(int x, int y) { 
     return constructCmd("java -jar move_mouse.jar " + x + " " + y); 
    } 

    default String clickLeft() { 
     return constructCmd("java -jar click_left.jar"); 
    } 

    static String constructCmd(String cmd) { 
     return "export DISPLAY=:1.0\n" + 
       "cd Desktop\n" + 
       cmd; 
    } 
} 

我有多個枚舉值與預設的,我可以全部枚舉有效地結合成一個,並且不使用界面什麼那麼,然而該枚舉將包含價值數百或數千,我想保留它有點舉辦,所以我已經在多個枚舉中分裂了。

我想要所有的枚舉共享相同的方法,所以我想我會給一個接口的默認方法一槍。

public enum Field implements Robot { 

    AGE_FIELD(778, 232), 

    NAME_FIELD(662, 280); 

    public int x; 
    public int y; 

    Field(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 
} 

這樣我就可以得到字符串命令是:

Field.AGE_FIELD.clickLeft(); 
Field.AGE_FIELD.moveMouse(Field.AGE_FIELD.x, Field.AGE_FIELD.y); 

然而moveMouse看起來真的對我不好,我覺得應該是在某種程度上可能默認使用枚舉的值。

任何人都有這樣的問題很好的解決方案?

+4

這似乎是一個概念性問題。你想要的是一個與'void moveMouse()','int getMouseTargetX()'和'int getMouseTargetY()'方法的接口。您當前的設計要求提供特定的x座標和y座標。我的建議假定對象具有一些屬性,定義x座標和y座標。我的提議更像是對已有系統的擴展,而不是替代品。您的界面將用於組件實際移動鼠標,而我的界面將被組件使用,這些組件會調用實際移動鼠標的組件。 – Turing85

回答

4

問題是你的架構。一方面,您有一個實際執行鼠標移動的圖層(由您的Robot接口表示)。現在,您需要一個產生鼠標移動的圖層並將其發送到Robot以執行此鼠標移動。讓我們把這個定義層MouseTarget接口(符合你的例子很好地):

public interface MouseTarget { 
    public int getTargetX(); 
    public int getTargetY(); 

    public default void moveMouseHere(Robot robot) { 
     robot.moveMouse(this.getTargetX(), this.getTargetY()); 
    } 
} 

此接口表示一個鼠標移動到一個目標。如您所見,moveMouseHere(Robot robot)方法預計Robot將移動發送給(實際工作)。現在,所有剩下的就是去適應你的Fields枚舉:

public enum Fields implements MouseTarget { 

    AGE_FIELD(778, 232), NAME_FIELD(662, 280); 

    public int targetX; 
    public int targetY; 

    Fields(int targetX, int targetY) { 
     this.targetX = targetX; 
     this.targetY = targetY; 
    } 

    @Override 
    public int getTargetX() { 
     return (this.targetX); 
    } 

    @Override 
    public int getTargetY() { 
     return (this.targetY); 
    } 
} 
2

正如你可能希望有Robot幾種實現方式,你做我顯然無法繼續,我寧願提供Robot實例的方法的枚舉而不是實現接口Robot,那麼它將更加靈活和容易測試。

枚舉Field

public enum Field { 

    ... 

    public String moveMouse(Robot robot) { 
     return robot.moveMouse(x, y); 
    } 

    public String clickLeft(Robot robot) { 
     return robot.clickLeft(); 
    } 
} 

即使它不是嚴格的Strategy pattern,它是globably同樣的做法。