Java 将ActionListener添加到未知对象
我有以下问题: 我有这样一个函数:Java 将ActionListener添加到未知对象,java,object,parameters,actionlistener,Java,Object,Parameters,Actionlistener,我有以下问题: 我有这样一个函数: public void addActionListenerObject(Object object) { object.addActionListener(this); } 我的问题如下:我需要一个解决方案,可以通过addActionListener函数作为参数传递任何对象。 列表可在此处找到: 有没有一种方法可以在没有大量实例的情况下解决这个问题 谢谢您正在寻找的是多态性。Component类型的所有实例都有addActionListener方法。
public void addActionListenerObject(Object object) {
object.addActionListener(this);
}
我的问题如下:我需要一个解决方案,可以通过addActionListener函数作为参数传递任何对象。
列表可在此处找到:
有没有一种方法可以在没有大量实例的情况下解决这个问题
谢谢您正在寻找的是多态性。Component
类型的所有实例都有addActionListener
方法。更改方法签名,使其预期为组件
,而不是对象
我认为addActioListener
是从组件继承而来的。事实并非如此。
该方法单独添加到每个组件类型中,没有父类。您要查找的是多态性。Component
类型的所有实例都有addActionListener
方法。更改方法签名,使其预期为组件
,而不是对象
我认为addActioListener
是从组件继承而来的。事实并非如此。
该方法单独添加到每个组件类型,没有父类。保留签名
如果您无法更改方法签名(即,如果您必须接收对象
,并且如果存在这样的方法定义,则调用addActionListener()
),则将使用更通用/健壮的解决方案来检查实际对象是否定义了addActionListener()
方法,也可以通过反思来实现。不管怎么说,这听起来是一个非常老套的方法
更改签名
如果您可以更改方法签名,请尝试使用AbstractButton
(),这是为JButton
、JToggleButton
和JMenuItem
定义此方法的超类,例如(请参阅“直接已知子类”和类定义树以了解实际提供方法的位置)
第二种方法只有在实际有一个超类定义该方法时才有效。如果有多个类,则必须使用If-else
结构和instanceof
+显式强制转换检查可能的类(这样才能保留原始对象
签名)
如果您提供有关原始问题的更多信息(例如,为什么需要这种方法),我们可能会找到更好的方法。保留签名
如果您无法更改方法签名(即,如果您必须接收对象
,并且如果存在这样的方法定义,则调用addActionListener()
),则将使用更通用/健壮的解决方案来检查实际对象是否定义了addActionListener()
方法,也可以通过反思来实现。不管怎么说,这听起来是一个非常老套的方法
更改签名
如果您可以更改方法签名,请尝试使用AbstractButton
(),这是为JButton
、JToggleButton
和JMenuItem
定义此方法的超类,例如(请参阅“直接已知子类”和类定义树以了解实际提供方法的位置)
第二种方法只有在实际有一个超类定义该方法时才有效。如果有多个类,则必须使用If-else
结构和instanceof
+显式强制转换检查可能的类(这样才能保留原始对象
签名)
如果您提供有关原始问题的更多信息(例如,为什么需要这种方法),我们可能会找到更好的方法。如果允许您更改addActionListenerObject
的签名,请传递函数接口(>=Java 1.8):
public class Just {
private ActionListener actionListener;
public void addActionListener(ActionListener actionListener) {
this.actionListener = actionListener;
}
public void doIt() {
System.out.println("Hello");
actionListener.actionPerformed(new ActionEvent(this, 3, "World"));
}
}
public class MyActionListener implements ActionListener {
public void addActionListenerObject(Consumer<ActionListener> consumer) {
consumer.accept(this);
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.getActionCommand());
}
}
这张照片是:
Hello
World
你好
世界
如果允许更改addActionListenerObject
的签名,则传递函数接口(>=仅限Java 1.8):
public class Just {
private ActionListener actionListener;
public void addActionListener(ActionListener actionListener) {
this.actionListener = actionListener;
}
public void doIt() {
System.out.println("Hello");
actionListener.actionPerformed(new ActionEvent(this, 3, "World"));
}
}
public class MyActionListener implements ActionListener {
public void addActionListenerObject(Consumer<ActionListener> consumer) {
consumer.accept(this);
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println(e.getActionCommand());
}
}
这张照片是:
Hello
World
你好
世界
类组件没有函数addActionListener。我有同样的想法,但我正在搜索正确的类,但我找不到它。请参阅我的编辑。最好是为每种必要的类型编写单独的方法。类组件没有函数addActionListener。我有同样的想法,但我正在搜索正确的类,但我找不到它。请参阅我的编辑。最好是为每种必要的类型编写单独的方法。这个类定义是什么?扩展/实现什么类/接口?此
是ActionListener此
类定义是什么?扩展/实现什么类/接口?这是一个ActionListener,因此使用AbstractButton的方法是我已经使用过的方法,但它没有覆盖其他对象。反射方法可能是最好的方法,但性能可能会有问题。我需要的方法,包装成一个图书馆由我多个行动侦听器。。。老实说,我可以让用户将我的对象添加为ActionListener,但感觉不对。if-else结构可能是最好的方法……反射方法更健壮,因为实现addActionListener(…)
方法的任何第三方或未来的类都将在不更改代码的情况下工作。另一方面,如果需要该方法变得如此健壮的概率很低(这意味着可能会使用一组紧密的类,包括AbstractButton等),并且性能和代码可维护性是更重要的要求,我会选择if-else
方法。与往常一样,最佳选择将取决于您实际问题的整体情况因此,使用AbstractButton的方法是我已经使用过的方法,但它并没有掩盖其他对象。反射法可能是最好的方法,但性能可能是个问题