为了账号安全,请及时绑定邮箱和手机立即绑定

Java // 冗余

Java // 冗余

莫回无 2022-05-12 16:34:37
我有下面提供的“示例代码”,我觉得这非常多余,并想请您与我一起解释是否有更冗余的方式来处理以下代码。public interface Bars {    FOO1 FOO1 = (FOO1) get(FOO1.class);    FOO2 FOO2 = (FOO2) get(FOO2.class);    FOO3 FOO3 = (FOO3) get(FOO3.class);    FOO4 FOO4 = (FOO4) get(FOO4.class);    static Bar get(Class<? extends Bar> clazz) {        return (Bar) FooBar.GET.getBars().get(clazz);    }非常感谢它:)
查看完整描述

3 回答

?
森林海

TA贡献2011条经验 获得超2个赞

我们需要查看更多信息以告知是否可以完全删除此代码(看起来您想使用 DI 框架),但您可以使 get 方法泛型以使其返回与其参数相同的类型:

static <T extends Bar> T get(Class<T> clazz);

这将摆脱调用端的类型转换。


查看完整回答
反对 回复 2022-05-12
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

你应该可以这样写:


public interface Bars {


    Foo1 FOO1 = get(Foo1.class);

    Foo2 FOO2 = get(Foo2.class);

    Foo3 FOO3 = get(Foo3.class);

    Foo4 FOO4 = get(Foo4.class);


    static <T extends Bar> T get(Class<T> clazz) {

        return clazz.cast(FooBar.GET.getBars().get(clazz));

    }

}

根据方法cast(...)声明的结果类型,可能不需要调用get(Class)。


在那之后,我认为没有更好的方法来初始化具有不同类型的 4 个不同的变量。


如果这些是局部变量,并且您使用的是 Java 10 或更高版本,则可以使用新var语法,这样就无需在声明中提及类型。(类型将从初始化表达式中推断出来。)


但是,这不适用于这种情况,因为您的示例将这些变量显示为接口的字段。该var语法只能用于局部变量的声明。


查看完整回答
反对 回复 2022-05-12
?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

将方法更改get为:


static <T extends Bar> T get(Class<T> clazz) {

    return clazz.cast(FooBar.GET.getBars().get(clazz));

}

您现在可以在不重复类型的情况下调用它:


var foo1 = get(Foo1.class);

var foo2 = get(Foo2.class);

该var语法仅适用于 Java 10+。在 Java 10 之前,您需要:


Foo1 foo1 = get(Foo1.class);

Foo2 foo2 = get(Foo2.class);

请注意,我已将上面的字母更改为小写以符合 Java 命名约定。


查看完整回答
反对 回复 2022-05-12
  • 3 回答
  • 0 关注
  • 126 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信