gpt4 book ai didi

Java/SpotBugs,如果在接口(interface)中声明 "named static inner class",那么它是什么?

转载 作者:行者123 更新时间:2023-12-02 03:24:22 27 4
gpt4 key购买 nike

我继承了一个使用 MyBatis 的代码库。 SpotBugs 告诉我,SubjectRepositoryQueries 可以重构为一个命名的 _static_ 内部类。我从未遇到过这个术语,我希望有人能解释它到底在问我什么做得更好。看起来 SubjectRepositoryQueries 实际上是命名的(它不是匿名的),并且它已经是静态的。 SubjectRepositoryQueries 无法声明为私有(private),因为它位于接口(interface)内部。

@Mapper
public interface SubjectRepositoryService {
@SelectProvider(type = SubjectRepositoryQueries.class, method = "search")
List<Subject> search(SubjectSearch subjectSearch);

static final class SubjectRepositoryQueries {
public String search(final SubjectSearch subjectSearch) {
... some string generation
}
}
}

谢谢!

最佳答案

当你声明内部类时

class Outer {
class Inner {
}
}

即使你没有在 Inner 中声明任何字段,java 编译器也会自动插入一个包含外部类引用的合成字段,通常称为类似 $0 的字段。因此,如果您在内部类上运行 javap,您就会看到它。

这个想法是,在许多情况下,拥有该引用变量会浪费空间,更重要的是会导致序列化等问题引起意想不到的问题。

想象一下,外层类(Class)有各种各样的领域,而且规模庞大。现在想象一下,您只想序列化内部类,如果您尝试这样做,您会惊讶地发现整个内部和外部实例都将被序列化,从而带来更慢、更大的体验。

通过用“static”修饰内部类,您将删除对外部类的合成字段引用,并阻止这种情况发生。

拥有正常的内部类还会导致其他一些问题。例如,您无法在不创建外部类的情况下创建内部类的实例,这会导致非常晦涩的语法,例如

Outer.Inner i = new Outer().new Inner();

关于Java/SpotBugs,如果在接口(interface)中声明 "named static inner class",那么它是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49741087/

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