gpt4 book ai didi

java - 如何为方法创建代理?

转载 作者:太空宇宙 更新时间:2023-11-04 06:23:55 24 4
gpt4 key购买 nike

问题

我有一个包含多个方法的服务类,如下所示。本文末尾描述了该类正在执行的具体操作。

public class Service{
public Foo m_a( /* args_a */ ){ ... }
public Bar m_b( /* args_b */ ){ ... }
// and so on
}

该服务中的所有公共(public)方法都有一个共同点:它们在执行其他操作之前调用 init() 方法。所以,我的服务看起来像这样:

public class Service{
private int attr;
private void init(int val){
this.attr = val;
}

public Foo m_a(int val_a, ...){
init(val_a);
// time for business A
}
public Bar m_b(int val_b, ...){
init(val_b);
// time for business B
}
// and so on
}

由于将来可能会在Service中添加其他方法,所以我认为上面的设计相当糟糕。为此类实现新方法的人可能不会遵循首先调用 init(val_x) 的规则,并且可能会导致错误。

解决方案草案

为了确保 init() 始终被调用,我可以创建一些代理方法来系统地完成这项工作:

public class Service{

// Init method
private int attr;
private void init(int val){
this.attr = val;
}

/*
* The only public method in the service is a proxy,
* that always calls init() before calling the actual requested method
*/
public Object invoke(String method, int val, Map<String,Object> args){

init(val);

switch(method){
case "m_a":
return m_a(args.get("name"),...);
case "m_b":
return m_b(args.get("myArg"),...);
default: // launch some exception
}
}

private Foo m_a( /* args_a */ ){ ... }
private Bar m_b( /* args_b */ ){ ... }
// and so on
}

我认为这是一种更好的方法,并且必须维护代码的开发人员将毫无困难地理解正在发生的事情。

但是我发现这个解决方案有一个很大的缺点:用户的可用性!

  • 在调用 invoke 方法之前,必须将其所有参数放入 Map 对象中,而不是直接在方法签名中输入参数
  • invoke 的返回类型是 Object,这是非常不明确的,并且要求用户在每次调用 invoke 时应用转换

你们对于如何消除这些问题有什么聪明的想法,并且仍然保留这个代理想法吗?

Service 类的工作

我实际上正在做的是实现 REST API。此 API 的目标是访问数据库中存储的特定资源。例如:

GET http://fortheking.com/topic/3

此 HTTP 请求将链接到一个服务方法,该方法根据给定的 ID 获取特定主题。

实际上,“topic”是要访问的资源的名称。它是我的 Service 类的每个方法的入口点,因此在实际启动该方法的预期逻辑之前需要应用一些通用代码。我已将此类代码放入 init() 中。

最佳答案

从根本上来说,您希望将Java 代理与ImplementationHandler 一起使用。该博客有点过时,但解释了基本概念:http://www.ibm.com/developerworks/library/j-jtp08305/ - “动态代理作为装饰器”部分可能与您最相关。这个想法是,您将向调用者返回一个“Service”实例,它实际上是一个代理对象。在该代理 InloggingHandler 中,您可以调用 init() 方法,然后执行 main 方法。如果您有也调用 init() 的现有方法,则需要确保 init() 是幂等的,或者更改代码以不调用它两次。

此方法的一个限制是您只能为接口(interface)创建代理,而不能为类创建代理。 (除非这个限制在我还没有看过的一些最新版本的 Java 中被取消了。)我知道你上面的示例代码已经被简化了,但是你没有显示任何接口(interface),所以这可能是你需要首先介绍的东西。最重要的是,服务的调用者必须直接使用 Interface 而不是 Service 类。

关于java - 如何为方法创建代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27063729/

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