2024Java开发社招面试解答之性能优化,用好 Java 中的枚举,spring框架面试

本文介绍了如何使用枚举在Java中实现单例模式和策略模式,展示了如何利用Java8的StreamAPI简化代码,并讨论了如何将枚举转换为JSON。此外,还提及了枚举在序列化和多态中的应用。
摘要由CSDN通过智能技术生成

pz2.setStatus(Pizza.PizzaStatus.ORDERED);

Pizza pz3 = new Pizza();

pz3.setStatus(Pizza.PizzaStatus.ORDERED);

Pizza pz4 = new Pizza();

pz4.setStatus(Pizza.PizzaStatus.READY);

pzList.add(pz1);

pzList.add(pz2);

pzList.add(pz3);

pzList.add(pz4);

EnumMap<Pizza.PizzaStatus,List> map = Pizza.groupPizzaByStatus(pzList);

assertTrue(map.get(Pizza.PizzaStatus.DELIVERED).size() == 1);

assertTrue(map.get(Pizza.PizzaStatus.ORDERED).size() == 2);

assertTrue(map.get(Pizza.PizzaStatus.READY).size() == 1);

}

7. 通过枚举实现一些设计模式


7.1 单例模式

通常,使用类实现 Singleton 模式并非易事,枚举提供了一种实现单例的简便方法。

《Effective Java 》和《Java与模式》都非常推荐这种方式,使用这种方式方式实现枚举可以有什么好处呢?

《Effective Java》

这种方法在功能上与公有域方法相近,但是它更加简洁,无偿提供了序列化机制,绝对防止多次实例化,即使是在面对复杂序列化或者反射攻击的时候。虽然这种方法还没有广泛采用,但是单元素的枚举类型已经成为实现 Singleton的最佳方法。—-《Effective Java 中文版 第二版》

《Java与模式》

《Java与模式》中,作者这样写道,使用枚举来实现单实例控制会更加简洁,而且无偿地提供了序列化机制,并由JVM从根本上提供保障,绝对防止多次实例化,是更简洁、高效、安全的实现单例的方式。

下面的代码段显示了如何使用枚举实现单例模式:

publicenum PizzaDeliverySystemConfiguration {

INSTANCE;

PizzaDeliverySystemConfiguration() {

// Initialization configuration which involves

// overriding defaults like delivery strategy

}

private PizzaDeliveryStrategy deliveryStrategy = PizzaDeliveryStrategy.NORMAL;

public static PizzaDeliverySystemConfiguration getInstance() {

return INSTANCE;

}

public PizzaDeliveryStrategy getDeliveryStrategy() {

return deliveryStrategy;

}

}

如何使用呢?请看下面的代码:

PizzaDeliveryStrategy deliveryStrategy = PizzaDeliverySystemConfiguration.getInstance().getDeliveryStrategy();

通过 PizzaDeliverySystemConfiguration.getInstance() 获取的就是单例的 PizzaDeliverySystemConfiguration

7.2 策略模式

通常,策略模式由不同类实现同一个接口来实现的。

这也就意味着添加新策略意味着添加新的实现类。使用枚举,可以轻松完成此任务,添加新的实现意味着只定义具有某个实现的另一个实例。

下面的代码段显示了如何使用枚举实现策略模式:

publicenum PizzaDeliveryStrategy {

EXPRESS {

@Override

public void deliver(Pizza pz) {

System.out.println(“Pizza will be delivered in express mode”);

}

},

NORMAL {

@Override

public void deliver(Pizza pz) {

System.out.println(“Pizza will be delivered in normal mode”);

}

};

public abstract void deliver(Pizza pz);

}

Pizza增加下面的方法:

public void deliver() {

if (isDeliverable()) {

PizzaDeliverySystemConfiguration.getInstance().getDeliveryStrategy()

.deliver(this);

this.setStatus(PizzaStatus.DELIVERED);

}

}

如何使用呢?请看下面的代码:

@Test

public void givenPizaOrder_whenDelivered_thenPizzaGetsDeliveredAndStatusChanges() {

Pizza pz = new Pizza();

pz.setStatus(Pizza.PizzaStatus.READY);

pz.deliver();

assertTrue(pz.getStatus() == Pizza.PizzaStatus.DELIVERED);

}

8. Java 8 与枚举


Pizza 类可以用Java 8重写,您可以看到方法 lambda 和Stream API如何使 getAllUndeliveredPizzas()groupPizzaByStatus()方法变得如此简洁:

getAllUndeliveredPizzas():

public static List getAllUndeliveredPizzas(List input) {

return input.stream().filter(

(s) -> !deliveredPizzaStatuses.contains(s.getStatus()))

.collect(Collectors.toList());

}

groupPizzaByStatus() :

publicstatic EnumMap<PizzaStatus, List>

groupPizzaByStatus(List pzList) {

EnumMap<PizzaStatus, List> map = pzList.stream().collect(

Collectors.groupingBy(Pizza::getStatus,

() -> new EnumMap<>(PizzaStatus.class), Collectors.toList()));

return map;

}

9. Enum 类型的 JSON 表现形式


使用Jackson库,可以将枚举类型的JSON表示为POJO。下面的代码段显示了可以用于同一目的的Jackson批注:

@JsonFormat(shape = JsonFormat.Shape.OBJECT)

publicenum PizzaStatus {

ORDERED (5){

@Override

public boolean isOrdered() {

returntrue;

}

},

READY (2){

@Override

public boolean isReady() {

returntrue;

}

},

DELIVERED (0){

@Override

public boolean isDelivered() {

returntrue;

}

};

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

分享

这次面试我也做了一些总结,确实还有很多要学的东西。相关面试题也做了整理,可以分享给大家,了解一下面试真题,想进大厂的或者想跳槽的小伙伴不妨好好利用时间来学习。学习的脚步一定不能停止!

薪酬缩水,“裸辞”奋战25天三面美团,交叉面却被吊打,我太难了

Spring Cloud实战

薪酬缩水,“裸辞”奋战25天三面美团,交叉面却被吊打,我太难了

Spring Boot实战

薪酬缩水,“裸辞”奋战25天三面美团,交叉面却被吊打,我太难了

面试题整理(性能优化+微服务+并发编程+开源框架+分布式)

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

ot实战

[外链图片转存中…(img-yFPPRz79-1712223073475)]

面试题整理(性能优化+微服务+并发编程+开源框架+分布式)

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值