Java内部类的设计-静态和非静态

278 阅读3分钟

抛出问题

在web开发中,从controller层返回数据时,不能把从数据库中查出的数据原样返回,这样暴露出的信息太多(字段名、字段值),我们需要在下层对库中查出的值进行封装。

在一对多的关系中,我们怎么封装数据呐? image.png

数据的封装

我们需要在返回的数据中表示出pop和sku一对多的关系,我们期待的返回对象如下:

@Data
public class QueryxxxPopResp {

    private String popCode;

    private Integer popType;

    private String materialCode;

    private String materialName;

    private String materialDesign;

    private List<PopSku> popSkuList;
}

那么,我们需要定义一个PopSku对象,而PopSku对象是和数据库表pop_sku对应的一个JavaBean对象,如果直接引用它,暴露的字段太多。

所以此时我们需要创建一个新的PopSku对象,只含有一部分我们想返回的字段,而这个对象只在QueryxxxPopResp中使用,这时候在QueryxxxPopResp对象中创建一个静态内部类是非常合理的。如下:

@Data
public class QueryxxxPopResp {

    private String popCode;

    private Integer popType;

    private String materialCode;

    private String materialName;

    private String materialDesign;

    private List<PopSku> popSkuList;

    @Data
    public static class PopSku {

        private String skuCode;

        private String skuName;
    }
}

Java内部类-静态和非静态

引用知乎问题:为什么Java内部类要设计成静态和非静态两种?

示例代码:

class Outer {
	class Inner {} // 非静态内部类
	static class StaticInner {} // 静态内部类
}

Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
Outer.StaticInner inner0 = new Outer.StaticInner();

Paranoid大佬的回答:

说一点自己的理解吧~
首先,我们需要明白,为什么要设计Java内部类?然后再去探究为何又将内部类设计为静态与非静态两种。

将一个类设计成内部类,我觉得有两方面因素:
 1.在一个类内部,需要操作某种属性,而这个属性需要涉及的面又很广,我们可以考虑,将这些属性设计为内部类。
 2.然后就如下面「铁心男」用户回答的那样,好比你设计类 B 的目的只是为了给类 A 使用,那么,
我们就可将其设定为内部类,没有必要将类 B 设置成单独的 Java 文件,防止与其他类产生依赖关系。

然后我们再来说说为什么又将内部类设计为静态内部类与内部类:
 1.首先来看一下静态内部类的特点:如「昭言」用户所述那样,我是静态内部类,只不过是想借你的外壳用一下。
本身来说,我和你没有什么“强依赖”上的关系。没有你,我也可以创建实例。那么,在设计内部类的时候我们就可以做出权衡:
如果我内部类与你外部类关系不紧密,耦合程度不高,不需要访问外部类的所有属性或方法,那么我就设计成静态内部类。
而且,由于静态内部类与外部类并不会保存相互之间的引用,因此在一定程度上,还会节省那么一点内存资源,何乐而不为呢~~
 2.既然上面已经说了什么时候应该用静态内部类,那么如果你的需求不符合静态内部类所提供的一切好处,
 你就应该考虑使用内部类了。最大的特点就是:你在内部类中需要访问有关外部类的所有属性及方法,我知晓你的一切...

总结:首先需要知道为什么会有内部类,什么时候应该使用内部类,我们再去讨论,
为什么 Java 的设计者们又将内部类设计为静态与非静态,这样就很清晰了。