Java/SpotBugs,什么是;命名的静态内部类";,如果是';在接口中声明了什么?

Java/SpotBugs,什么是;命名的静态内部类";,如果是';在接口中声明了什么?,java,static-analysis,lint,findbugs,spotbugs,Java,Static Analysis,Lint,Findbugs,Spotbugs,我继承了一个使用MyBatis的代码库。SpotBugs告诉我,SubjectRepositoryQueries可以重构成一个命名的“静态”内部类。我从未遇到过这个术语,我希望有人能解释它到底要求我做得更好些什么。似乎subjectrepositoryquerys实际上是命名的(它不是匿名的),并且它已经是静态的SubjectRepositoryQueries不能声明为私有,因为它位于接口内部 @Mapper public interface SubjectRepositoryService {

我继承了一个使用MyBatis的代码库。SpotBugs告诉我,
SubjectRepositoryQueries
可以重构成一个命名的“静态”内部类。
我从未遇到过这个术语,我希望有人能解释它到底要求我做得更好些什么。似乎
subjectrepositoryquerys
实际上是命名的(它不是匿名的),并且它已经是静态的
SubjectRepositoryQueries
不能声明为私有,因为它位于接口内部

@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
    }
  }
}
@Mapper
公共接口SubjectRepositoryService{
@选择提供者(type=subjectrepositoryquerys.class,method=“search”)
列表搜索(SubjectSearch SubjectSearch);
静态最终类SubjectRepositoryQueries{
公共字符串搜索(最终主题搜索SubjectSearch SubjectSearch){
…一些字符串生成
}
}
}

谢谢

目前还不清楚具体的警告是什么意思。如果您的唯一目标是删除警告,那么假设您的内部类没有实现接口,您可以简单地将其转换为静态方法

@Mapper
public interface SubjectRepositoryService {
    //...

    static String search(final SubjectSearch subjectSearch) {
        //... some string generation
    }
}

当您声明一个内部类时

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

其思想是,在许多情况下,拥有该引用变量是一种空间浪费,更重要的是会导致序列化之类的事情导致意外问题

想象一下,外层阶级有各种各样的领域,而且是巨大的。现在假设您只想序列化内部类,如果您尝试这样做,您会惊讶地发现整个内部和外部实例将被序列化,从而获得更慢、更大的体验

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

还有其他一些事情是由正常的内部类引起的。例如,如果不创建外部类,就不能创建内部类的实例,这会导致像

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

请注意,
静态
是多余的,因为在
接口
中声明的任何
默认为
公共静态
。JLS定义中的“内部类”不能用
静态
声明。因此,他们似乎误用了这个术语,试图将SubjectRepositoryQueries类添加到静态内部类@JonathanS中。Fisher@Andrew这就是为什么confusing@Michael事实上这是一个很好的观点。。。Java8+支持这一点