写出优雅代码

一. 封装,继承,多态

封装

尽可能隐藏一个模块的实现细节。原因:

  • 增加调用者负担,使用者在使用你的类时还要知道实现细节。
  • 耦合性。比如类内部有个成员是vector,那么外部应该用push_back等方法来操作,有一天需要换城map,那么所有调用方的代码都得改。

应该对外界提供访问数据的方法(getter、setter);而不是直接将数据等实现细节暴露出去。

继承

不能仅仅因为is-a和is-kind-of就定义为继承关系,必须是派生类能够适用基类所有继承方法,而不会逻辑不通而无法使用使用可能会造成安全隐患,否则不能成为继承关系。

  • 逻辑不通而无法使用:duck->bird,bird {fly(); run();} 而duck只能使用run,fly方法没法使用,所以不鞥作为继承关系。
  • 使用可能会造成安全隐患:stack->list,list有clear方法,但是应用在stack上会
    清楚所有元素,这是我们不想要的。如果定义成继承关系,使用者无意间调用了clear会引发严重的安全问题。

优先使用组合而非继承。继承是 behaves-like-a, is-substitutable-for 的关系,不是 is-a 或 is-a-kind-of 的关系

多态

相同的代码应用到不同场景就能表现出不同的行为。

二. 设计原则

单一职责

一个函数只干一件事。这里的一件事是指做具体的操作,只是调用了定义操作的函数,不算具体的操作。

#干了两件事,获取数据;数据格式化
def get_format_info():
	#get data from mysql
	#get data from redis
	return data.format()
	
#将数据访问封装成函数,这样get_format_info中自定义了流程,只干了一件事
def get_data():
	#get data from mysql
	#get data from redis
def get_format_info():
	data = get_data()
	return data.format()

参考:
https://www.zhihu.com/question/28492982

<think>我们参考了用户提供的引用内容,总结出编优雅Java代码的几个关键点: 1. 使用Java新特性(如Lambda表达式、嵌套Lambda、自定义注解等)简化代码 2. 遵循代码规范,学习优秀框架源码(如JDK、Spring) 3. 使用设计模式(如策略模式)替代大量的if else,提高代码健壮性和扩展性 4. 将可变参数配置化(存于数据库或配置文件) 5. 总结并使用工具 根据这些要点,我们整理出以下方法: </think>以下是编优雅Java代码的核心方法,结合业界最佳实践和引用资料: ### 一、基础规范优化 1. **命名清晰性** - 类名用大驼峰(`OrderService`) - 方法/变量用小驼峰(`calculateTotalPrice()`) - 常量全大(`MAX_RETRY_COUNT`) 2. **代码简洁性** ```java // 冗余法 ↓ if (list.isEmpty() == true) {...} // 优雅法 ↓ if (list.isEmpty()) {...} ``` 3. **异常处理原则** - 避免`catch(Exception e)`过度捕获 - 使用特定异常类型(如`FileNotFoundException`) - 优先使用`try-with-resources`自动关闭资源: ```java try (BufferedReader br = new BufferedReader(new FileReader(path))) { return br.readLine(); } ``` ### 二、Java新特性应用 1. **Lambda与Stream API** ```java // 传统循环 ↓ for (User user : users) { if (user.isActive()) names.add(user.getName()); } // 优雅法 ↓ List<String> names = users.stream() .filter(User::isActive) .map(User::getName) .collect(Collectors.toList()); ``` 2. **嵌套Lambda(Java11+)** ```java Function<Integer, Function<Integer, Integer>> add = x -> y -> x + y; System.out.println(add.apply(3).apply(5)); // 输出8 ``` 3. **自定义注解(元编程)** ```java @Repeatable(Colors.class) public @interface Color { String value(); } @Color("Red") @Color("Blue") public class ThemeConfig {...} ``` ### 三、设计模式实践 1. **策略模式消除if/else** ```java // 传统法(难以扩展)↓ if ("Alipay".equals(payType)) {...} else if ("Wechat".equals(payType)) {...} // 优雅方案 ↓ public interface Payment { void pay(BigDecimal amount); } @Service("Alipay") public class Alipay implements Payment {...} // 具体策略实现 ``` 2. **工厂模式解耦创建** ```java public class PaymentFactory { public static Payment getPayment(String type) { return SpringContext.getBean(type); // 结合Spring容器 } } ``` ### 四、工程化实践 1. **配置化管理可变参数** - 将阈值/开关存入数据库或配置中心(如Nacos) ```properties # application.properties user.inactive.days=30 order.expire.hours=2 ``` 2. **源码学习路径** | 源码库 | 学习重点 | |--------------|-------------------------| | JDK | `java.util.stream`设计 | | Spring | Bean生命周期管理 | | Guava | 集合工具类实现 | 3. **静态代码分析工具** - 使用SonarQube检测代码异味 - 用Checkstyle强制执行编码规范 - 通过Jacoco保证测试覆盖率 >80% > 优雅代码的本质:**像散文一样代码——追求简洁性、可读性和可维护性的统一**[^1][^5]。建议定期重构并研读Spring Framework源码(如`org.springframework.util`包),感受其接口设计与异常处理艺术[^2][^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值