gpt4 book ai didi

java - 如何重写匿名泛型类的方法?

转载 作者:行者123 更新时间:2023-11-30 07:58:13 25 4
gpt4 key购买 nike

我正在使用 JDK7 开发 GWT 项目。它有两个入口点(两个客户端),位于项目的不同包中。客户端共享位于 /common 包中的一些代码,这些代码是通用的,并且可以通过在各自的 xml 构建文件中包含以下行来访问:

    <source path='ui/common' />

两个客户端都有自己特定的回调类实现,该类为它们的运行环境提供服务,并在失败或成功时执行各种操作。我有以下抽象类,它实现 AsyncCallback 接口(interface),然后由其各自的客户端扩展。

public abstract class AbstractCallback<T> implements AsyncCallback<T> {
public void handleSuccess( T result ) {}
...
}

以下是客户端的类:

public class Client1Callback<T> extends AbstractCallback<T> {...}

public class Client2Callback<T> extends AbstractCallback<T> {...}

在也包含这些回调类的 common 包中,我正在致力于实现为两个客户端提供服务的服务层。客户端使用相同的后端服务,只是处理结果的方式不同。根据客户端的类型,我想构建一个相应的 AbstractCallback 子实例,而无需为每次调用重复创建匿名类。我将有许多如下所示的声明:

   AsyncCallback<MyVO> nextCallback = isClient1 ?
new Client1Callback<MyVO>("ABC") {
public void handleSuccess(MyVO result) {
doThatSameAction(result);
}
}
:
new Client2Callback<MyVO>("DEF") {
public void handleSuccess(MyVO result) {
doThatSameAction(result);
}
};

这将导致非常冗长的代码。

意图(以伪代码形式)是使用以下内容:

AsyncCallback<MyVO> nextCallback = new CallbackTypeResolver.ACallback<MyVO>(clientType, "ABC"){
public void handleSuccess(MyVO result) {
doThatSameAction(result);
}
};

我正在使用工厂模式来获取正确的子实例,但很快意识到我无法在创建实例后重写 handleSuccess() 方法。

我认为解决方案可能来自两个来源之一:

  1. 处理自定义回调实现的不同 GWT 方式,我们将其称为替代现有解决方案。
  2. Java 泛型/类型杂耍魔法

我可能会错过一些明显的东西,并且希望得到任何建议。我在这里和 Oracle 上读过一些关于泛型类型删除的文章,所以我知道我的问题可能没有直接答案。

最佳答案

handleSuccess 行为重构到它自己的类中。

handleSuccess 行为与 AsyncCallback 类中发生的其他行为是不同的;因此,将其分离成更有用的形式。请参阅Why should I prefer composition over inheritance?

本质上,通过进行此重构,您将重写的方法转换为 injected behavior你有更多的控制权。具体来说,您可以:

public interface SuccessHandler<T> {
public void handleSuccess(T result);
}

您的回调将如下所示:

public abstract class AbstractCallback<T> implements AsyncCallback<T> {
private final SuccessHandler<T> handler; // Inject this in the constructor

// etc.

// not abstract anymore
public void handleSuccess( T result ) {
handler.handleSuccess(result);
}
}

那么你的伪代码回调创建语句将类似于:

AsyncCallback<MyVO> nextCallback = new CallbackTypeResolver.ACallback<MyVO>(
clientType,
"ABC",
new SuccessHandler<MyVO>() {
public void handleSuccess(MyVO result) {
doThatSameMethod(result);
}
});

SuccessHandler 的实现不必是匿名的,它们可以是顶级类,甚至可以根据您的需要是内部类。使用这个基于注入(inject)的框架后,您可以做更多的事情,包括使用 Gin 创建这些具有自动注入(inject)依赖项的处理程序。和 Guice Providers 。 (Gin 是一个将依赖注入(inject)框架 Guice 与 GWT 集成的项目)。

关于java - 如何重写匿名泛型类的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32341567/

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