【问题标题】:Passing dynamic class objects in Java在 Java 中传递动态类对象
【发布时间】:2016-07-16 12:11:42
【问题描述】:

将动态类对象作为参数传递的最佳方法是什么?

我的用例是这样的,

我有一个通用的网络类,它根据给定的类型执行网络操作,然后将响应转换为 pojo 类。这是一个演示,

 public abstract class CommonOperations {

     public void getAuthToken() {
     ......
     AuthToken authToken = response.body();
     success(authToken);
    }

     public void performLogin() {
     ......
     Login login = response.body();
     success(login);
    }

    }

 public abstract void success(Object object);

稍后,我想从被覆盖的类中接收动态对象。

例如

@Override
 public void success(Object requestedObject) {

 AuthToken authToken = (AuthToken) requestedObject;

}

@Override
 public void success(Object requestedObject) {

 Login login = (Login) requestedObject;

}

有没有办法在 Java 中实现这一点?

我发现了一些基于 Java 泛型和反射的类似解决方案,但我不确定如何在这种情况下应用它。

【问题讨论】:

  • 这里最好创建2个方法。 1 采用 Login 和 1 采用 AuthToken。或者你可以让用户传入一个回调作为参数。

标签: java android retrofit2 okhttp3


【解决方案1】:

您可以只使用instanceof 运算符来检查您的Object 参数的子类型:

@Override
public void success(Object requestedObject) {
    if(requestedObject instanceof AuthToken) {
        AuthToken authToken = (AuthToken) requestedObject;
    } else if(requestedObject instanceof Login) {
        Login login = (Login) requestedObject;
    }
    // ...
}

【讨论】:

    【解决方案2】:

    如果您的success 不会收到除AuthTokenLogin 之外的任何其他内容,并且将来类型的数量不会增加,我建议您使用重载方法来强制执行更好的类型安全,像这样:

    public abstract void success(AuthToken at);
    public abstract void success(Login l); 
    public abstract void success(WhateverElse obj);
    

    查看给定的非常有限的上下文,我猜上述条件适用,因此方法重载将是您的最佳选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 1970-01-01
      相关资源
      最近更新 更多