我有一个名为LinkGroup的类,它包含一些游戏对象。我调用Rotate为这些对象设置一些旋转变量。每当我的游戏到达其更新循环时,我会根据旋转变量旋转对象。如果它们旋转得足够多,我会触发onComplete回调。
以下代码有效......
public void Rotate(){
_currentRotation = _0;
_targetRotation = 180; //degrees
_rotationSpeed = 50;
try{
_onComplete = LinkGroup.class.getDeclaredMethod("rotateComplete", null);
}
catch(Exception ex){
}
}
......但这很难看。
我不喜欢声明方法rotateComplete并手动将其链接到通过字符串旋转。是否有类似于C#中的匿名函数,所以我可以在Rotate方法中声明rotateComplete方法?
对于奖励积分,有没有更好的方法来实现“getDeclaredMethod”所需的异常处理? Terseness是一种偏好。
答案 0 :(得分:7)
根据我的理解,我相信只要某个游戏对象被旋转,你就试图在onRotateComplete()
类中调用LinkGroup
方法。您可以使用Java Swing用于处理按钮单击或其他事件的模式:这可以通过以下方式完成:
定义界面
interface IRotateHandler {
public void onRotateComplete();
}
将Rotate()
更改为Rotate(IRotateHandler handler)
,然后在LinkGroup
课程中,您可以像这样调用您的游戏对象。
gameObject.Rotate(new IRotateHandler() {
public void onRotateComplete() {
/* do your stuff!
}
}
答案 1 :(得分:4)
您无需使用getDeclaredMethod
。只需将_onComplete
设为Runnable
(或类似的东西),然后创建一个匿名类:
public void Rotate(){
_currentRotation = _0;
_targetRotation = 180; //degrees
_rotationSpeed = 50;
_onComplete = new Runnable() {
public void run() {
rotateComplete();
}
};
}
答案 2 :(得分:0)
Java 7还没有闭包。 Java 8 will.因此,暂时没有办法在Java中匿名编写该函数。
对于错误处理,快速glance at the API告诉我你扔了两个RuntimeExceptions
和一个ReflectiveOperationException
。抓住Exception
可能是您最好的选择,除非您想以不同方式捕获所有这三种可能的异常,并根据每种异常采取不同的行动。