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

use*_*023 4 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;
    }
} 
Run Code Online (Sandbox Code Playgroud)

我有多个带有预设值的枚举,我可以有效地将所有枚举组合成一个而不使用任何接口,但是该枚举将包含数百或数千个值,我想使其保持一定的井井有条,所以我已经拆分了所有在多个枚举中。

我希望所有枚举共享相同的方法,所以我想我会在接口中提供默认方法。

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我可以通过以下方式获取字符串命令:

Field.AGE_FIELD.clickLeft();
Field.AGE_FIELD.moveMouse(Field.AGE_FIELD.x, Field.AGE_FIELD.y);
Run Code Online (Sandbox Code Playgroud)

然而,mouseMouse 对我来说看起来真的很糟糕,我认为默认情况下应该可以以某种方式使用枚举的值。

任何人都有解决此类问题的好方法?

Tur*_*g85 5

问题是你的架构。一方面,您有一个实际执行鼠标移动的层(由您的Robot界面表示)。现在,您需要一个层来产生鼠标移动并将其发送到 aRobot以执行此鼠标移动。让我们调用定义此层的接口MouseTarget(非常适合您的示例):

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

    default void moveMouseHere(Robot robot) {
        robot.moveMouse(this.getTargetX(), this.getTargetY());
    }
}
Run Code Online (Sandbox Code Playgroud)

这个界面代表鼠标移动到一个目标。如您所见,该moveMouseHere(Robot robot)方法期望 aRobot将运动发送到(执行实际工作)。现在,剩下的就是调整您的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 targetX;
    }

    @Override
    public int getTargetY() {
        return targetY;
    }
}
Run Code Online (Sandbox Code Playgroud)