内部类与静态内部类
1.内部类
- 内部类可以访问父类的所有成员变量及作用域中的数据
- 内部类可以对其他包隐藏
- 要使用的时候必须先有父类
2.静态内部类
- 静态内部类不能访问外部类的实例成员,只能访问外部类的类成员。
- 部类可以使用静态内部类的类名作为调用者来访问静态内部类的类成员,也可以使用静态内部类对象访问其实例成员。
3.大白话
- 如果内部类中需要访问父类的属性及一些数据,需要定义普通内部类
- 如果内部类中不需要访问父类的属性,成员,而且也可以独立使用,那么就定义为静态内部类
4.内部类和父类的引用
- 内部类用componet修饰
- 父类使用Resource或Autowired注解引入就可以实现
5.样例
5.1静态内部类
- AlarmConvert内部类不需要使用到父类的任何成员及相关字段,就定义为静态内部类
@Component
@Slf4j
public class ConvertAlarmNode implements Node<AlarmModel> {
List<CallbackListener> callbackListeners;
@Resource
AlarmConvert alarmConvert;
@PostConstruct
public void init(){
this.callbackListeners = Lists.newArrayList(BeanContext.getBean(AlarmHistoryRecordListener.class));
}
@Override
public void run(ProcessContext<AlarmModel> context) {
AlarmHistoryRecord historyRecord = alarmConvert.convert(context.getProcessModel());
for (CallbackListener listener : callbackListeners) {
listener.onMessage(historyRecord);
}
log.info("消息ID:[{}] @@三方告警告警数据历史记录执行完毕",context.getProcessModel().messageId);
}
@Component
static class AlarmConvert implements Converter<AlarmModel, AlarmHistoryRecord>{
@Override
public AlarmHistoryRecord convert(AlarmModel alarmModel) {
return null;
}
}
}
6.内部类和静态内部类使用上
- 使用静态内部类(Static Nested Class):
如果内部类不需要访问外部类的实例成员,建议使用静态内部类。
静态内部类更易于测试,因为不需要外部类的实例。
OuterClass.StaticNestedClass nested = new OuterClass.StaticNestedClass();
nested.nestedMethod();
- 使用非静态内部类(Inner Class):
如果内部类需要访问外部类的实例成员,使用非静态内部类。像样例5中访问外部类的resoource注解修饰的服务的时候,就需要使用非静态内部类
在测试时,需要创建外部类的实例,这可能会增加测试代码的复杂性。
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
inner.innerMethod();
7.使用总结
在实际开发中,优先选择静态内部类,除非确实需要访问外部类的实例成员。这样可以简化代码结构,提高可测试性和可维护性。
8.场景
什么时候使用内部类,什么时候平铺开来和外部类保持同一层级?
当内部类的逻辑简单且与外部类紧密相关,除此之外没有别的地方的调用,可以用内部类来增强封装性和内聚性,可以隐藏实现细节,避免这些类被其他不相关的代码使用。避免在包中创建过多的类文件,使得包结构更加简洁
原创:做时间的朋友