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 对我来说看起来真的很糟糕,我认为默认情况下应该可以以某种方式使用枚举的值。
任何人都有解决此类问题的好方法?
问题是你的架构。一方面,您有一个实际执行鼠标移动的层(由您的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)
归档时间: |
|
查看次数: |
3662 次 |
最近记录: |