阿里Java编程规约【二】常量定义

简介: 1. 【强制】不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。反例:

1. 【强制】不允许任何魔法值(即未经预先定义的常量)直接出现在代码中。

反例:


// 开发者 A 定义了缓存的 key。
String key = "Id#taobao_" + tradeId;
cache.put(key, value);
// 开发者 B 使用缓存时直接复制少了下划线,即 key 是"Id#taobao" + tradeId,导致出现故障。
String key = "Id#taobao" + tradeId;
cache.get(key);


2. 【强制】long 或 Long 赋值时,数值后使用大写 L,不能是小写 l,小写容易跟数字混淆,造成误解。


说明:public static final Long NUM = 2l; 写的是数字的 21,还是 Long 型的 2?


3. 【强制】浮点数类型的数值后缀统一为大写的 D 或 F。


正例:public static final double HEIGHT = 175.5D;

public static final float WEIGHT = 150.3F;


4. 【推荐】不要使用一个常量类维护所有常量,要按常量功能进行归类,分开维护。

说明:大而全的常量类,杂乱无章,使用查找功能才能定位到要修改的常量,不利于理解,也不利于维护。


正例:缓存相关常量放在类 CacheConsts 下;系统配置相关常量放在类 SystemConfigConsts 下。


5. 【推荐】常量的复用层次有五层:跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常 量、类内共享常量。


1)跨应用共享常量:放置在二方库中,通常是 client.jar 中的 constant 目录下。


2)应用内共享常量:放置在一方库中,通常是子模块中的 constant 目录下。

反例:易懂常量也要统一定义成应用内共享常量,两个程序员在两个类中分别定义了表示“是”的常量:

类 A 中:public static final String YES = "yes";

类 B 中:public static final String YES = "y";

A.YES.equals(B.YES),预期是 true,但实际返回为 false,导致线上问题。


3)子工程内部共享常量:即在当前子工程的 constant 目录下。


4)包内共享常量:即在当前包下单独的 constant 目录下。


5)类内共享常量:直接在类内部 private static final 定义。


6. 【推荐】如果变量值仅在一个固定范围内变化用 enum 类型来定义。

说明:如果存在名称之外的延伸属性应使用 enum 类型,下面正例中的数字就是延伸信息,表示一年中的第几个季节。

正例:



public enum SeasonEnum {
  SPRING(1), SUMMER(2), AUTUMN(3), WINTER(4);
  private int seq;
  SeasonEnum(int seq) {
    this.seq = seq;
  }
  public int getSeq() {
    return seq;
  }
}

额外加餐


1. 局部类在一个 Java 代码块中声明,不是类的成员)能访问所在块中的局部变量。不过这种能力有个重要的限制,即局部类只能访问声明为 final 的局部变量和参数。


局部类之所以能使用局部变量,是因为 javac 自动为局部类创建了私有实例字段,保存局部类用到的各个局部变量的副本。

编译器还在局部类的构造方法中添加了隐藏的参数,初始化这些自动创建的私有字段。其实,局部类没有访问局部变量,真正访问的是局部变量的私有副本。如果在局部类外部能修改局部变量,就会导致不一致性。


2. 接口只用于定义类型(effective Java 第二版 第15条):


如果要在多个类中使用一组常量,更适合在一个接口中定义这些常量,需要使用这些常量的类实现这个常量接口(constant interface)。例如,客户端类和服务器类在实现网络协议时,就可以把细节(例如连接和监听的端口号)存储在一些符号常量中。举个实例,java.io.ObjectStreamConstants 接口。这个接口为对象序列化协议定义了一些常量,ObjectInputStream 和 ObjectOutputStream 类都实现了这个接口。

从接口中继承常量的主要好处是,能减少输入的代码量,因为无需指定定义常量的类型。但是,除了 ObjectStreamConstants 接口之外,并不推荐这么做。常量是实现细节,不该在类签名的 implements 子句中声明。


更好的方式是在类中定义常量,而且使用时要输入完整的类名和常量名。使用 import static 指令从定义常量的类中导入常量,可以减少输入的代码量。


3. 在可移植程序的约定中使用常量避免硬编码文件名


可移植的程序不能使用硬编码的文件名或目录名,因为不同的平台使用十分不同的文件系统组织方式,而且使用不同的目录分隔符。如果要使用文件或目录,让用户指定文件名,至少也要让用户指定文件所在的基目录。这个操作可在运行时完成,在配置文件或程序的命令行参数中指定文件名。需要把文件名或目录名连接到目录名上时,要使用 File() 构造方法或 File.separator 常量。


参考

2022 Java开发手册(黄山版).pdf


目录
相关文章
|
2月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
226 1
|
2月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
165 6
|
3月前
|
SQL Java 数据库
2025 年 Java 从零基础小白到编程高手的详细学习路线攻略
2025年Java学习路线涵盖基础语法、面向对象、数据库、JavaWeb、Spring全家桶、分布式、云原生与高并发技术,结合实战项目与源码分析,助力零基础学员系统掌握Java开发技能,从入门到精通,全面提升竞争力,顺利进阶编程高手。
681 1
|
2月前
|
安全 前端开发 Java
从反射到方法句柄:深入探索Java动态编程的终极解决方案
从反射到方法句柄,Java 动态编程不断演进。方法句柄以强类型、低开销、易优化的特性,解决反射性能差、类型弱、安全性低等问题,结合 `invokedynamic` 成为支撑 Lambda 与动态语言的终极方案。
162 0
|
3月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
457 100
|
3月前
|
人工智能 Java 开发者
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
JManus是阿里开源的Java版OpenManus,基于Spring AI Alibaba框架,助力Java开发者便捷应用AI技术。支持多Agent框架、网页配置、MCP协议及PLAN-ACT模式,可集成多模型,适配阿里云百炼平台与本地ollama。提供Docker与源码部署方式,具备无限上下文处理能力,适用于复杂AI场景。当前仍在完善模型配置等功能,欢迎参与开源共建。
1599 58
阿里出手!Java 开发者狂喜!开源 AI Agent 框架 JManus 来了,初次见面就心动~
|
3月前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
329 1
|
6月前
|
Java 数据库连接 API
2025 更新必看:Java 编程基础入门级超级完整版指南
本教程为2025更新版Java编程基础入门指南,涵盖开发环境搭建(SDKMAN!管理JDK、VS Code配置)、Java 17+新特性(文本块、Switch表达式增强、Record类)、面向对象编程(接口默认方法、抽象类与模板方法)、集合框架深度应用(Stream API高级操作、并发集合)、模式匹配与密封类等。还包括学生成绩管理系统实战项目,涉及Maven构建、Lombok简化代码、JDBC数据库操作及JavaFX界面开发。同时提供JUnit测试、日志框架使用技巧及进阶学习资源推荐,助你掌握Java核心技术并迈向高级开发。
754 5
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
136 1