Java // 冗余

我有下面提供的“示例代码”,我觉得这非常多余,并想请您与我一起解释是否有更冗余的方式来处理以下代码。


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);

    }

非常感谢它:)


莫回无
浏览 150回答 3
3回答

森林海

我们需要查看更多信息以告知是否可以完全删除此代码(看起来您想使用 DI 框架),但您可以使 get 方法泛型以使其返回与其参数相同的类型:static&nbsp;<T&nbsp;extends&nbsp;Bar>&nbsp;T&nbsp;get(Class<T>&nbsp;clazz);这将摆脱调用端的类型转换。

哆啦的时光机

你应该可以这样写:public interface Bars {&nbsp; &nbsp; Foo1 FOO1 = get(Foo1.class);&nbsp; &nbsp; Foo2 FOO2 = get(Foo2.class);&nbsp; &nbsp; Foo3 FOO3 = get(Foo3.class);&nbsp; &nbsp; Foo4 FOO4 = get(Foo4.class);&nbsp; &nbsp; static <T extends Bar> T get(Class<T> clazz) {&nbsp; &nbsp; &nbsp; &nbsp; return clazz.cast(FooBar.GET.getBars().get(clazz));&nbsp; &nbsp; }}根据方法cast(...)声明的结果类型,可能不需要调用get(Class)。在那之后,我认为没有更好的方法来初始化具有不同类型的 4 个不同的变量。如果这些是局部变量,并且您使用的是 Java 10 或更高版本,则可以使用新var语法,这样就无需在声明中提及类型。(类型将从初始化表达式中推断出来。)但是,这不适用于这种情况,因为您的示例将这些变量显示为接口的字段。该var语法只能用于局部变量的声明。

尚方宝剑之说

将方法更改get为:static <T extends Bar> T get(Class<T> clazz) {&nbsp; &nbsp; 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 命名约定。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java