admin管理员组文章数量:1037775
实战总结
大家好,我是create17,见字如面。
最近总结一下开发过程中,用到的 Java 接口和抽象类的使用场景,希望能给大家带来一些帮助和启发,也鼓励大家评论区留言自己的见解哟!
一、接口&抽象类
1、接口(Interface)的意义:
- 定义契约,这些方法是类必须要实现的。例如,一个List接口定义了 add(), remove(), get()等方法,确保所有的实现类如 ArrayList 和 LinkedList 都提供这些方法。
- 支持多重继承。
- 增强灵活性和扩展性:新的类只需要实现相关的接口。
- 解耦代码:调用者只需要知道接口,而不需要关心具体的实现类。
2、抽象类(Abstract Class)的意义:
抽象类是一种特殊的类,它不能被实例化,只能被继承。抽象类中可以包含抽象方法和非抽象方法。抽象方法是没有实现的方法,必须在子类中被实现。抽象类的存在主要是为了让子类共享一些方法或属性,同时又要求子类必须实现某些方法。
- 部分实现:抽象类可以包含具体方法(已经实现的方法)以及抽象方法(没有实现的方法)。这使得抽象类可以提供部分实现,供子类共享。例如,一个Animal抽象类可以包含一个move()方法的具体实现和一个抽象的sound()方法。
- 代码复用:抽象类允许在多个子类之间共享代码,减少代码重复。具体子类可以直接继承抽象类的实现,或者根据需要重写方法。
- 定义状态:抽象类可以包含实例变量,允许它们定义和维护状态。接口则不能包含实例变量。
- 控制继承层次结构:使用抽象类可以更好地控制继承层次结构,确保所有子类都从一个共同的基类继承,可以在基类中集中管理共有功能。
二、场景示例
1、场景示例一:
我需要创建两个单例模式下的 mqtt 客户端(两客户端信息不同)。一般写法是,两份相同的代码,但 mqtt client 信息不一样。如果考虑复用的场景,我们可以使用接口 + 抽象类的方式去完成。
如下图所示:
- 创建 IMqttClient 接口,里面定义了三个必须要实现的方法。
- 然后创建 AbstractMqttClient 抽象类,实现了接口的三个方法,并定义了订阅、发送数据的方法,共享子类复用。
- 最后,创建了两个 MqttClient 实例,都继承了 AbstractMqttClient 提供的通用功能,无需重复实现连接、订阅、发布等通用逻辑,只需关注特定配置和扩展功能即可。
2、场景示例二:
两个实体类中,都有 emission 和 percent,现在要根据 emission 分别计算这两个实体类中 emission 占总量的 percent。希望能封装一个方法分别计算出这两个实体类的 percent。
如下图所示:
- 首先,创建 CarbonAccounting 抽象类,里面有两子类都有的 emission 和 percent 属性。
- 两个实体类继承 CarbonAccounting 抽象类
- 编写计算函数:
private <T extends CarbonAccounting> void calculateAndSetEmissionPercent(List<T> list) {
// 计算总排放
float totalEmission = 0f;
for (T vo : list) {
if (vo.getEmission() != null) {
totalEmission += vo.getEmission();
}
}
// 进行百分比的计算并保留两位小数
for (T vo : list) {
if (vo.getEmission() != null && totalEmission > 0) {
float percent = (vo.getEmission() / totalEmission) * 100;
vo.setPercent(NumberUtil.round(percent, 2).floatValue());
} else {
vo.setPercent(0f);
}
}
}
上面方法的传参 List 泛型 T,继承于 CarbonAccounting,可以同时兼容 CarbonAccounting 的子类计算。如下图所示:
好了,本次分享就到这里了,欢迎大家在底部评论区留言自己的见解哟!
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2024-07-23,如有侵权请联系 cloudcommunity@tencent 删除接口客户端java变量继承实战总结
大家好,我是create17,见字如面。
最近总结一下开发过程中,用到的 Java 接口和抽象类的使用场景,希望能给大家带来一些帮助和启发,也鼓励大家评论区留言自己的见解哟!
一、接口&抽象类
1、接口(Interface)的意义:
- 定义契约,这些方法是类必须要实现的。例如,一个List接口定义了 add(), remove(), get()等方法,确保所有的实现类如 ArrayList 和 LinkedList 都提供这些方法。
- 支持多重继承。
- 增强灵活性和扩展性:新的类只需要实现相关的接口。
- 解耦代码:调用者只需要知道接口,而不需要关心具体的实现类。
2、抽象类(Abstract Class)的意义:
抽象类是一种特殊的类,它不能被实例化,只能被继承。抽象类中可以包含抽象方法和非抽象方法。抽象方法是没有实现的方法,必须在子类中被实现。抽象类的存在主要是为了让子类共享一些方法或属性,同时又要求子类必须实现某些方法。
- 部分实现:抽象类可以包含具体方法(已经实现的方法)以及抽象方法(没有实现的方法)。这使得抽象类可以提供部分实现,供子类共享。例如,一个Animal抽象类可以包含一个move()方法的具体实现和一个抽象的sound()方法。
- 代码复用:抽象类允许在多个子类之间共享代码,减少代码重复。具体子类可以直接继承抽象类的实现,或者根据需要重写方法。
- 定义状态:抽象类可以包含实例变量,允许它们定义和维护状态。接口则不能包含实例变量。
- 控制继承层次结构:使用抽象类可以更好地控制继承层次结构,确保所有子类都从一个共同的基类继承,可以在基类中集中管理共有功能。
二、场景示例
1、场景示例一:
我需要创建两个单例模式下的 mqtt 客户端(两客户端信息不同)。一般写法是,两份相同的代码,但 mqtt client 信息不一样。如果考虑复用的场景,我们可以使用接口 + 抽象类的方式去完成。
如下图所示:
- 创建 IMqttClient 接口,里面定义了三个必须要实现的方法。
- 然后创建 AbstractMqttClient 抽象类,实现了接口的三个方法,并定义了订阅、发送数据的方法,共享子类复用。
- 最后,创建了两个 MqttClient 实例,都继承了 AbstractMqttClient 提供的通用功能,无需重复实现连接、订阅、发布等通用逻辑,只需关注特定配置和扩展功能即可。
2、场景示例二:
两个实体类中,都有 emission 和 percent,现在要根据 emission 分别计算这两个实体类中 emission 占总量的 percent。希望能封装一个方法分别计算出这两个实体类的 percent。
如下图所示:
- 首先,创建 CarbonAccounting 抽象类,里面有两子类都有的 emission 和 percent 属性。
- 两个实体类继承 CarbonAccounting 抽象类
- 编写计算函数:
private <T extends CarbonAccounting> void calculateAndSetEmissionPercent(List<T> list) {
// 计算总排放
float totalEmission = 0f;
for (T vo : list) {
if (vo.getEmission() != null) {
totalEmission += vo.getEmission();
}
}
// 进行百分比的计算并保留两位小数
for (T vo : list) {
if (vo.getEmission() != null && totalEmission > 0) {
float percent = (vo.getEmission() / totalEmission) * 100;
vo.setPercent(NumberUtil.round(percent, 2).floatValue());
} else {
vo.setPercent(0f);
}
}
}
上面方法的传参 List 泛型 T,继承于 CarbonAccounting,可以同时兼容 CarbonAccounting 的子类计算。如下图所示:
好了,本次分享就到这里了,欢迎大家在底部评论区留言自己的见解哟!
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2024-07-23,如有侵权请联系 cloudcommunity@tencent 删除接口客户端java变量继承本文标签: 实战总结
版权声明:本文标题:实战总结 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1748256878a2276195.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论