有没有办法在Java中修改类实例?例如,我想提供自定义回调方法。
如何为类的每个实例提供单独的方法/上下文/范围?
在javascript中,很容易修改现有的类。将anonymous函数作为回调传递给任何方法也很容易。有了它的背景和范围。
或者,如果我需要不同的回调,我是否必须为每个请求扩展自定义类?
答案 0 :(得分:5)
您可以在实例化中执行此操作,如:
Whatever w = new Whatever("Something") {
public void onWhateverDoThis() {
//...
}
};
所以我个人最近使用的是模态的回调方法:
ModalManager.show(new Modal("Title", "Text") {
public void onDismiss() {
//Do something on dismiss
}
public void onConfirm() {
//Do something on confirm
}
});
答案 1 :(得分:1)
Java和Javascript是非常不同的语言。如果您尝试应用一种在另一种中起作用的编程范例,您会非常沮丧。我一开始对Javascript感到非常沮丧,来自Java,直到我理解动态和静态语言之间的根本区别。
在这种特殊情况下,我不认为每次需要使用不同的回调时扩展您的类是个好主意,因为这会导致大量的子类。如果您需要大量仅在特定方面有所不同的对象,那么拥有代表该特定方面的类或接口会不会更好?
一种可能的解决方案(但不是唯一正确的解决方案)是使用策略模式:定义一个代表回调的接口,并为您需要的每个不同回调实现接口。然后,您可以将这些回调作为参数传递,就像在Javascript中一样,但这些回调不能访问调用它们的类的任何非公共成员。
另外请务必查看Apache Commons Functor库,其中主要是有代表函数的对象。我从未使用它,但作为Apache Commons,如果我有你的要求,它肯定会是我的第一站。
答案 2 :(得分:0)
由于经典的非功能性Java不适合您提到的那些运行时目标,因此您可以轻松地感到沮丧。
但实际上,你可以使用这样的接口在java中实现回调:
参考:CALLBACK PATTERN IN JAVA ENVIRONMENT
例如,假设您希望在事件发生时收到通知。
您可以定义如下界面:
public interface SomeEvent{
// A regular method, it can return something or take arguments
public void someEventMethod();
}
然后,定义一个将发出信号/通知事件的类,它需要期望实现SomeEvent接口的对象,然后根据需要调用someEventMethod()方法。
public class EventNotifier{
private SomeEvent se;
private boolean somethingHappened;
public EventNotifier (SomeEvent event){
//Save the event object for later use.
se = event;
// Nothing to report yet.
somethingHappened = false;
}
//...
public void doWork (){
//Check the predicate, which is set elsewhere.
if (somethingHappened){
//Signal the even by invoking the interface's method
se.someEventMethod();
}
//...
}
// ...
}
最后,编写一些期望接收事件通知的代码,它必须实现SomeEvent接口,并将对自身的引用传递给事件通知器,如下所示:
public class CallMe implements SomeEvent{
private EventNotifier en;
public CallMe (){
//Create the event notifier and pass itself to it.
en = new EventNotifier (this);
}
//Define the actual handler for the event
public void someEventMethod(){
// Some event interesting must have occurred
// Do something...
}
}