gpt4 book ai didi

java - 我是来自 javascript 背景的 java 新手 : how do they manage event listeners properly and not tighting classes together?

转载 作者:行者123 更新时间:2023-12-02 07:24:22 25 4
gpt4 key购买 nike

我一直在尝试用java做一些“简单的事情”,在javascript中看起来像这样:

// Main class
var model = new Model();
this.callback = function(e){/* do something */}
model.addListener("change", callback);

在java中,到目前为止我发现Main类从java.util.Observer派生,Model从java.util.Observable派生;然后,当模型调度事件时,它将调用 Main 类上的 update 方法。我发现真的很丑而且一点也不优雅。我什至无法想象如何使用它;

有没有更干净、灵活的方法,也许有一些库可以帮助我,因为我还没有找到任何可接受的关于如何这样做的教程?

非常感谢

到目前为止我所管理的,我非常喜欢它,而不是仅仅为简单事件创建“空”类(但仍然不好,至少对我来说):

private ArrayList __items;
public void addListener(Method method, Object object){
this.__listeners.add(new Object[] {method, object});
}


public void dispatch(){
int i = this.__listeners.size();
Method method;
Object context;
while(i>0){
i--;
method = (Method)(this.__listeners.get(i))[0];
context = (Object)(this.__listeners.get(i))[1];
try{
method.invoke(context);
}catch(java.lang.reflect.InvocationTargetException e){

}catch(java.lang.IllegalAccessException e){

}
}
}

然后我这样使用:

Gifts gifts = prendastotty.PrendasTotty.getMain().getLoggedUserGifts();
Class[] parameterTypes = new Class[0];
try{
Method m = Home.class.getMethod("__updateTable", parameterTypes);
gifts.addListener(m, this);
}catch(NoSuchMethodException e){

}

这有漏洞/反模式/有缺陷吗?

最佳答案

我必须说,我在跟上你的代码时遇到了一些麻烦,因为在我看来,有些东西没有意义(从 Java 的思维方式来看,或者至少我的) Java 的思维方式)。所以我希望我能正确理解您的意思并能帮助您。

让我们首先举一个简单的例子:

var model = new Model();
this.callback = function(e){/* do something */}
model.addListener("change", callback);

例如,在 Java 中,一个好的方法是:

public interface ModelListener {
public void execute(Model context);
}

public class Model {
private List<ModelListener> listeners;

public Model() {
this.listeners = new ArrayList<ModelListener>();
}

public void addListener(ModelListener listener) {
this.listeners.add(listener);
}

public void dispatch() {
for (ModelListener listener: listeners) {
listener.execute(this);
}
}

}

通过这种设计,您现在可以执行以下两件事之一:

使用匿名类

在 Java 中,最常见的情况是所有类都有一个名称,尽管在某些情况下您可以创建匿名类,但这些类基本上是是内联实现的。由于它们是内联实现的,因此它们通常只是在它们很小的时候使用,并且知道它们不会被重复使用。

示例:

Model model = new Model();
model.add(new ModelListener() {
public void execute(Model model) { /* do something here */ }
});

请注意如何创建新的 ModelListener 对象(它是一个接口(interface))以及如何内联提供 execute 实现。这就是匿名类。

接口(interface)实现

您可以创建实现您的接口(interface)的类并使用它们而不是匿名类。当您希望监听器可重用、具有为代码赋予语义含义的名称和/或它们的逻辑不仅仅是几行代码时,通常会使用此方法。

示例:

public class LogListener implements ModelListener {

public void execute(Model model) {
// Do my logging here
}
}

Model model = new Model();
model.addListener(new LogListener());

旁注

作为旁注,我看到您尝试绑定(bind)为监听器的方法称为 __updateTable 您是否有机会尝试检测对象的更改,以便可以将它们提交到数据库?如果是这样,我强烈建议您看一些ORM框架如HibernateJPA他们会为您免除所有麻烦,跟踪更改并将其提交到数据库。

希望它能有所帮助,来自葡萄牙 StackOverflow 用户的问候;)

关于java - 我是来自 javascript 背景的 java 新手 : how do they manage event listeners properly and not tighting classes together?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13753300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com