静态内部类应用场景

338 阅读2分钟

32-4408.jpg

前言

静态内部类的使用场景

(1)、外部类需要使用内部类,而内部类无需使用外部类的资源

(2)、内部类可以独立外部类创建对象

使用示例

示例1

嵌套Json反序列化为JAVA对象

Json结构如下

{
  "name": "John",
  "age": 30,
  "address": {
    "street": "123 Main St",
    "city": "New York"
  }
}

Java对象结构如下

import com.fasterxml.jackson.annotation.JsonGetter;
import com.fasterxml.jackson.annotation.JsonSetter;

public class Person {
    private String name;
    private int age;
    private Address address;

    // 默认构造函数
    public Person() {
    }

    @JsonGetter("name")
    public String getName() {
        return name;
    }

    @JsonSetter("name")
    public void setName(String name) {
        this.name = name;
    }

    @JsonGetter("age")
    public int getAge() {
        return age;
    }

    @JsonSetter("age")
    public void setAge(int age) {
        this.age = age;
    }

    @JsonGetter("address")
    public Address getAddress() {
        return address;
    }

    @JsonSetter("address")
    public void setAddress(Address address) {
        this.address = address;
    }

    // 静态内部类表示地址
    public static class Address {
        private String street;
        private String city;

        // 默认构造函数
        public Address() {
        }

        public String getStreet() {
            return street;
        }

        public void setStreet(String street) {
            this.street = street;
        }

        public String getCity() {
            return city;
        }

        public void setCity(String city) {
            this.city = city;
        }
    }
}

使用Jackson库进行反序列化

import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {
    public static void main(String[] args) throws Exception {
        String json = "{\"name\":\"John\",\"age\":30,\"address\":{\"street\":\"123 Main St\",\"city\":\"New York\"}}";

        ObjectMapper objectMapper = new ObjectMapper();
        Person person = objectMapper.readValue(json, Person.class);

        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
        Person.Address address = person.getAddress();
        System.out.println("Street: " + address.getStreet());
        System.out.println("City: " + address.getCity());
    }
}

实际上,使用静态内部类来表示嵌套的JSON数据结构是一个很好的做法,因为静态内部类不需要外部类的实例,而且更容易组织和管理代码

示例2

建造者模式

class Product {
    private String part1;
    private String part2;

    public static class Builder {
        private Product product = new Product();

        public Builder setPart1(String part1) {
            product.part1 = part1;
            return this;
        }

        public Builder setPart2(String part2) {
            product.part2 = part2;
            return this;
        }

        public Product build() {
            return product;
        }
    }
}

内部类可以用于帮助构建复杂对象的不同部分,最终组合成一个完整的对象。

示例3

未完待后续

静态内部类和普通内部类对比

1)普通内部类不能有静态变量和方法

解释下原因:普通内部类也叫成员内部类,顾名思义,它跟成员变量是一个级别的,所以它是外部类实例的一部分,静态的变量属于类的一部分和实例无关,那么显然在普通内部类中声明和类实例无关的静态属性是不合适的。

2)多个外部类可以共享一个静态内部类

但是如果需要多个外部类共享一个静态内部类,倒不如放弃静态内部类的方式(违反初衷)