有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何切换一个类或改进它

public <T> T getData(final Class<T> cast, final String query)
{
    final Optional<JSONObject> optional = Optional.ofNullable(new JSONObject(getHTTP(query))).filter(s -> s.has("data") && s.getJSONArray("data").length() > 0 && s.getJSONArray("data").get(0) instanceof JSONObject);

    if (optional.isPresent())
    {
        final JSONObject json = JSONObject.class.cast(optional.get().getJSONArray("data").get(0));

        return switch (cast.getSimpleName())
        {
            case Profile.class -> new Profile(<parameters>);
            case UserVideo.class -> new UserVideo(<parameters>);
            default -> null;
        };
    }

    return null;
}

我想改进这段代码并像这样调用它

final Profile profile = getData(Profile.class, String.format(URL, "data"))

问题是我不能切换类,我不想使用字符串(因为我想增强我的知识,让它比简单更复杂)

是否有其他方法可以切换一个类并使用不同的参数解析(甚至反射类)并返回它。 考虑此方法可以返回不同类型的类,并且只给出链接和请求的数据。


共 (1) 个答案

  1. # 1 楼答案

    不幸的是,java中的开关功能不如其他语言强大。我认为唯一的方法是通过if elseif chain

    if (cast == Profile.class) { ... }
    else if (cast == UserVideo.class) { ... }
    else { return null; }
    

    如果你允许我重新设计API,我更喜欢:

    public JSONObject getData(String query) { ... }
     -
    profile = Profile.fromJSON(getData(String.format(URL, "data")))
     -
    class Profile {
      static Profile fromJSON(JSONObject json) {
        return new Profile(...)
      }
    }
    

    编辑:

    等等,我有个新主意

    public <T> T getData(Function<JSONObject, T> cast, String query) {
       JSONObject json = ...;
       return cast.apply(json);
    }
    
    profile = getData(Profile::fromJSON, String.format(URL, "data"))
    

    这相当于我之前的答案,但看起来更像你的代码


    编辑2:

    如果您不喜欢Profile::fromJSON,还可以使用静态常量

    static final Function<JSONObject, Profile> PROFILE = json -> new Profile(...);
    
    profile = getData(PROFILE, ...)