Java8在接口的默认方法中使用枚举值

时间:2016-10-26 09:15:10

标签: java enums interface java-8

我正在探索java 8中引入的静态和默认方法的可能性。

我的接口有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;
    }
}

所以我可以通过以下方式获取String命令:

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

然而,moveMouse对我来说看起来非常糟糕,我认为默认情况下应该以某种方式使用枚举值。

对于这样的问题,任何人都有一个很好的解决方案吗?

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:2)

由于您可能希望有几个Robot的实现,我显然不会像您那样继续,我宁愿为您的枚举方法提供Robot实例,而不是实现接口{ {1}},它会更灵活,更容易测试。

枚举Robot

Field

即使它不是严格意义上的Strategy pattern,它也是完全相同的方法。