为了帮助我学习Java和编程概念,我正在编写一个可以解决游戏中PuzzleFreak难题的机器人。
我让游戏的控制器成为单身人士,因为应该只有一个。但是,现在我到处都是Controller.getInstance()
。我怎么能让这个更简洁? Singleton甚至可以去这里吗?
我可以将控制器方法包装在默认方法中,这样我就可以在click(x,y)
实现中调用Player
,但这感觉不对。
下面我有播放器界面和示例实现。
Player.java:
public interface Player {
default void giveUp() {
Controller.getInstance().click(new Rectangle(704, 545, 64, 18));
Controller.getInstance().delay(0.1);
Controller.getInstance().click(new Rectangle(704, 545, 64, 18));
}
default void play() {
giveUp();
}
}
StartupPlayer.java:
public class StartupPlayer implements Player {
public void play(){
Controller.getInstance().click(60, 278);
Controller.getInstance().delay(0.5);
Controller.getInstance().type("KevinBot");
Controller.getInstance().delay(0.5);
Controller.getInstance().click(400, 463);
}
}
答案 0 :(得分:2)
只需声明一个本地控制器并拨打getInstance()
一次:
例如:
public class StartupPlayer implements Player {
public void play(){
Controller controller = Controller.getInstance()
controller.click(60, 278);
controller.delay(0.5);
controller.type("KevinBot");
controller.delay(0.5);
controller.click(400, 463);
}
}
答案 1 :(得分:1)
在界面中,您可以通过getter获取控制器:
public interface Player {
default void giveUp() {
Controller controller = getController();
controller.click(new Rectangle(704, 545, 64, 18));
controller.delay(0.1);
controller.click(new Rectangle(704, 545, 64, 18));
}
default void play() {
giveUp();
}
default Controller getController() {
return Controller.getInstance();
}
}
然后,实现类也使用getter:
public class StartupPlayer implements Player {
public void play(){
Controller controller = getController();
controller.click(60, 278);
controller.delay(0.5);
controller.type("KevinBot");
controller.delay(0.5);
controller.click(400, 463);
}
}
通过这种方式,以后更容易更改单身人士的决定。
此外,如果您要连续调用许多控制器方法,您可以考虑将其设为fluent interface,并将getter重命名为controller
(我认为它会使其更多也很流利,你有:
public interface Player {
default void giveUp() {
controller().
click(new Rectangle(704, 545, 64, 18)).
delay(0.1).
click(new Rectangle(704, 545, 64, 18));
}
default void play() {
giveUp();
}
default Controller controller() {
return Controller.getInstance();
}
}
public class StartupPlayer implements Player {
public void play(){
controller().
click(60, 278).
delay(0.5).
type("KevinBot").
delay(0.5).
click(400, 463);
}
}
这进一步减少了详细程度......
而且,如果您在play
的界面中提供的默认实现真的意味着每次都被覆盖,那么您应该考虑将其保持抽象。方法giveUp
仍可用于实现要使用的类。
答案 2 :(得分:0)
将其设置为目标上下文(类)中的变量;即使在变量中,它也是同一个实例。只是对同一个实例的不同引用。
答案 3 :(得分:0)
您可以使用名为 SigletonEnum 的公共枚举,其中包含一个名为 INSTANCE 的实例。 这是一个单身人士。
由于这是枚举,因此不需要实例化。然后在应用程序中,您可以将其称为
SingletonEnum.INSTANCE.doSomething();