面试题答案
一键面试Kotlin枚举类设计
- 定义枚举类:
enum class TransactionType {
DEPOSIT, WITHDRAWAL, TRANSFER
}
- 处理交易操作:
fun handleTransaction(type: TransactionType) {
when (type) {
TransactionType.DEPOSIT -> {
// 处理存款逻辑
}
TransactionType.WITHDRAWAL -> {
// 处理取款逻辑
}
TransactionType.TRANSFER -> {
// 处理转账逻辑
}
}
}
性能表现:
- 优点:枚举类的实例是在编译期就确定的,内存开销相对固定,在简单的交易类型判断场景下,
when
语句的分支判断效率较高,因为Kotlin对枚举的when
有优化,类似于switch - case
的高效实现。 - 缺点:当交易类型不断增加时,
when
语句会变得冗长,维护性降低,并且枚举类继承自kotlin.Enum
,不能再继承其他类,扩展性受限。
高并发优化思路:
- 线程安全:由于枚举类实例在编译期就创建好且不可变,天然线程安全,无需额外同步机制。
- 缓存机制:如果涉及到一些基于交易类型的复杂计算且结果不变,可以考虑在枚举类中缓存计算结果,避免重复计算。
Kotlin密封类设计
- 定义密封类:
sealed class Transaction {
object Deposit : Transaction()
object Withdrawal : Transaction()
object Transfer : Transaction()
}
- 处理交易操作:
fun handleTransaction(transaction: Transaction) {
when (transaction) {
is Transaction.Deposit -> {
// 处理存款逻辑
}
is Transaction.Withdrawal -> {
// 处理取款逻辑
}
is Transaction.Transfer -> {
// 处理转账逻辑
}
}
}
性能表现:
- 优点:密封类提供了更灵活的层次结构,当交易类型有子类型或者需要附加额外信息时更方便扩展。
when
语句用于密封类时,如果没有覆盖所有分支,编译器会报错,提高了代码的安全性。 - 缺点:相比枚举类,密封类实例创建在运行时,有一定的性能开销。并且密封类对象的内存管理相对复杂一些。
高并发优化思路:
- 减少对象创建:如果密封类实例创建开销大,可以考虑使用对象池技术,复用已创建的实例。
- 同步控制:如果密封类的方法涉及共享资源操作,需要适当使用
synchronized
关键字或java.util.concurrent
包下的同步工具保证线程安全。