【Java】优雅代码更需要优雅的写法
各位优秀的程序员们,相信你们已经阅读过很多遍JDK的源码以及一些优秀的业务、框架源码了,但是总有一些源码让我等望而却步 ,原因并不是因为代码的难度,而是因为代码的规范程度,好的代码在拥有足够深的技术水平之上肯定会以足够赏心悦目的书写规范来呈现给大家。
本篇文章不谈技术,浅谈一些Java语言设计层面上的语法问题。
首先介绍几种常见的书写语法:
驼峰式命名法(Lower-Camel-Case):(小) 驼峰式命名法是Java推荐的书写语法 要求如果命名字段中有多个单词,首单词的首字母小写,之后的单词首字母大写。
public String lowerCamelCase(){}
帕斯卡命名法(Upper Camel Case) : 帕斯卡命名法又称大驼峰命名法,是C#推荐的书写语法,要求命名字段中的所有单词首字母大写,在Java中通常用作类名的书写。
public void UpperCamelCase(){}
匈牙利命名法(Hungarian nomenclature): 匈牙利命名法是一名匈牙利程序员发明出的命名法,要求在命名之前通常加入其对应的数值类型。
private String szString;
本文因针对Java语言,故以驼峰式命名法为基准,其他命名法作为掌握即可。
Java语法规范基本按照JDK源码规范书写:
命名规则
名称只能由字母、数字、下划线、$符号组成 且不能以数字开头 ,一般情况下开发者不会特意的去使用美元符或者下划线作为开头字母。
名称不能使用JAVA中的关键字或保留字。Java会将.java文件编译成.class的字节码文件,如果把变量名称设置为Java中的关键字或保留字,会在编译期间将变量名称当成关键字或保留字处理,会产生编译时异常。
不建议取用
不建议使用汉字或拼音进行命名。 在实际的开发环境中,一个项目会分配给多个工作组人员共同完成,所以不要采用中文或者拼音混淆的方式进行命名,而且有些工作组内尚有外国友人,一定要用世界通用语言,英语来标准命名,不要采用中文或汉语拼音的书写形式。标准命名也促进了自己的英语学习不是吗?
命名规范
项目名称小写。项目名称小写是为了美观,而且与下一条相辅相成↓
包名称小写。包名就是一个目录的名字,既要起到名称的作用,又要起到目录的作用,名称告知程序员包的作用,目录告诉程序员这个包的功能,尽量将包的名称起的抽象一些,才能起到包含的作用,如SSM中的包名经常为controller,dao,pojo,service.....而具体每个包下都包含着什么类呢,即使初次看代码的程序员也肯定能猜得到,controller层下肯定都是各种各样的具体的controller类啦~
package com.alibaba.fastjson -> JSON-> JSONArray-> JSONObject
类名按帕斯卡命名法命名。作为面向对象的编程语言,类的命名要与普通的变量命名做以区分,那么如何做区分呢,便是通过帕斯卡命名法和驼峰式命名法的区别。
变量名、方法名按驼峰式命名法命名。
常量名全部大写。在Java的语法中有一类特殊的变量,即常量,那么如何区分变量和常量的区别呢?Java规定,在常量的书写中,要求常量名称全部采用大写字母,如Math类中的常量π的命名
/*** The {@code double} value that is closer than any other to* <i>pi</i>, the ratio of the circumference of a circle to its* diameter.*/public static final double PI = 3.14159265358979323846;
注释
Java中的注释主要分为三种:
单行注释,一般用于语句间的注解,针对一些较难理解或者值得注意的语句的提醒,例如ArrayList源码中对于GC处理的注解。
private void fastRemove(int index) {modCount++;int numMoved = size - index - 1;if (numMoved > 0)System.arraycopy(elementData, index+1, elementData, index,numMoved);elementData[--size] = null; // clear to let GC do its work}
多行注释,一般用于大段篇幅的注解,但是不会记录进Javadoc中。
/*Multi-line comment*/
文档注释,一般用于大段篇幅的注解,会记录进Javadoc中,且可以内嵌HTML标签,再Javadoc中以HTML文档进行展示,例如String类中的value[]注释
/** The value is used for character storage. */private final char value[];
注解修饰
注解的存在可以试试代码更加整洁美观,以下为几种常用的注解
@Override:面向对象语言的四大特点,封装继承抽象多态,当类与类之间产生继承关系并要重写其超类方法时,要注明@Override注解
@Overridepublic String toString() {return "HelloWorld";}
@Deprecated:带有@Deprecated注解的属性或类或方法被标注为弃用,不建议使用,通常源码中,带有@Deprecated注解的类或方法的上方文档注释都写有可以替代的类或方法。例如String类中弃用的构造方法方法String(byte ascii[], int hibyte)。
@Deprecatedpublic String(byte ascii[], int hibyte) {this(ascii, hibyte, 0, ascii.length);}
@param:@param作用于有参数方法的文档注释中,用于解释传入参数的意义,方便其他开发者进行代码阅读或逻辑开发,一般格式为 @param parameterName reference
@return: @return作用于有返回值的方法的文档注释中,用于指明返回值的含义,方便其他开发者进行代码阅读或逻辑开发 一般格式为 @return reference
@see:@see 用于文档注释中,用于指明该方法或类可以参考的对象,@see 后面如果加className表示可以参考className类,如果加#methodName时,则表示可以参考本类中的methodName方法。
一般格式为 @see className
@see #methodName
一下为Spring中StringUtils类种hasLength方法的文档注释,其中的还掺杂有html标签和@code等注释,如有兴趣可以自行学习。
/*** Check that the given {@code CharSequence} is neither {@code null} nor* of length 0.* <p>Note: this method returns {@code true} for a {@code CharSequence}* that purely consists of whitespace.* <p><pre class="code">* StringUtils.hasLength(null) = false* StringUtils.hasLength("") = false* StringUtils.hasLength(" ") = true* StringUtils.hasLength("Hello") = true* </pre>* @param str the {@code CharSequence} to check (may be {@code null})* @return {@code true} if the {@code CharSequence} is not {@code null} and has length* @see #hasText(String)*/public static boolean hasLength(@Nullable CharSequence str) {return (str != null && str.length() > 0);}
不成文的命名规则
所谓不成文的命名规则即在遵循Java语法命名规则之上,有着对代码可读性,美观性进行进一步提升命名规则,也体现出一个优秀程序员的自我修养。
命名要有含义,所谓望文知意。在公司级别项目组中,各部门需要通过git进行代码上的补充和整理,代码命名的整洁可以提高代码的可读性。
不避讳代码名称长度过长。有很多的程序员经常用一些缩写字母来代替变量或是类的名称,导致了代码的可读性极差,如果程序员的命名是cowal , 无论谁都猜不到是什么意思,这也是为什么JDK源码中要把它命名为CopyOnWriteArrayList(java.util.aoncurrent),源码尚不避讳,程序员又有何理由用缩写呢?
java.util.concurrent.CopyOnWriteArrayList;
接口命名采用形容词:面向接口编程在实战当中很常见,一个接口可以被多个类实现,那么一个接口也就有着众多个类的共同属性,也就是说这个接口的名称属性是所有派生类的共有属性,所以以形容词作为接口的名称再适合不过,比如JDK中的接口名称:
Serializable,Callable,Runnable....
接口内方法不书写public关键字,属性不书写final关键字。很多的程序员,包括一些大牛们都会不经意间在接口中的方法前加上public关键字,其实如果仔细阅读过源码的同学可以注意下,无论是JDK源码还是优秀的框架源码,Interface中的方法都是不带有public关键字的,属性都是不带有final关键字的,看似无关痛痒,却是一个程序员对优雅代码的追求和向往。
使用static静态代码块进行常量获取。大家都知道标注final static的属性为全局类属性,那么在初始化时要注意一下的是,如果静态常量初始化赋值,在属性后直接用等于号赋值即可,如果需要进行换算赋值,推荐使用static静态代码块进行赋值,这样可以区不同种类的分静态常量,可以增强代码的可读性,例如
public final static String string = "Hello world";public final static size;static{size = string.length(); }
使用static进行静态导入:当一个类中需要多次用到同一个工具类中的静态方法使,要进行static静态导入,这样就不必在使用方法时标注类名称,节约代码空间。例如在一个类中反复用到JDK中的Math类的静态方法时,可以通过静态导入,静态导入只能导入方法,不可导入类,但是可以通过*通配符进行通配导入。一般格式为:import static project.package.class.method;
导入Math类中所有静态方法:
import static java.lang.Math.*;
文章能够记录点滴,知识无量,我们仍需不断的学习进步,希望各位优秀的程序员们能够写出更加优雅的代码。
-by decmoon
【Java】优雅代码更需要优雅的写法相关推荐
- 通过facade(尤其是realtime facade)来使代码更优雅
本文来自pilishen.com----原文链接; 欢迎作客我们的php&Laravel学习群:109256050 该篇翻译整理自laravel创始人Taylor的文章:Expressive ...
- java 代码整洁快捷方式_代码整洁之道:你的代码是否足够优雅、整洁、易懂?...
普通的工程师堆砌代码,优秀的工程师优雅代码,卓越的工程师简化代码.如何写出优雅整洁易懂的代码是一门学问,也是软件工程实践里重要的一环.下面从注释.命名.方法,并发等视角简单给出了部分最佳实践.相信每一 ...
- 10个实用技巧让你的 Vue 代码更优雅
点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 作者:johnYu https://juejin.im/post/6854573215969181703 前言 作为深度代码洁癖,我们都希 ...
- python优雅代码大全_10个Python技巧帮你写出更优雅的代码
阅读本文需要 2 分钟,公众号 somenzz ,欢迎学习 Python 的朋友订阅. 现在写代码的门槛非常低了,少儿都开始编程了,但从代码的风格一眼看出编码水平.是的,写代码是容易的,写出易读的代码 ...
- js倒计时代码最简单的_10个简单的技巧让你的 vue.js 代码更优雅
作为深度代码洁癖,我们都希望能写出简单高效的代码,让我们的代码看起来更加优雅,让我们抛弃繁杂的代码,一起开启简单的旅程~~ slots 新语法向 3.0 看齐 ❝使用带有"#"的新 ...
- 3 个简单的技巧让你的 vue.js 代码更优雅!
关注 逆锋起笔,回复"加群" 加入我们一起学习,天天进步 作者:红尘炼心 https://juejin.cn/post/7005751368937897991 前言 近来入坑了一个 ...
- 优雅Java01 优雅代码万岁
1. DTO转化 @RequestMapping("/v1/api/user") @RestController public class UserApi {@Autowiredp ...
- java关闭服务_实现优雅地关闭Docker中的java服务
时至今日,Docker在项目中的应用越来越普遍了,但往往会遭遇一些麻烦,比如说,有几个请求至Docker中的服务,发起了事务处理业务,但每个事务完成可能需要1-5分钟,而此时我们正要将Docker停机 ...
- [转]新兵训练营系列课程——编写优雅代码
原文:http://weibo.com/p/1001643877361430185536 课程大纲 什么是好代码 如何编写优雅的代码 如何做出优雅的设计 如何规划合理的架构 如何处理遗留代码 什么是好 ...
最新文章
- php redis管理系统,php+redis实现小型的用户管理系统
- 基于Hexo搭建博客
- 【ArcGIS微课1000例】0012:ArcGIS创建及连接ArcSDE企业级地理数据库实例
- 输入一个三位正整数,输出百位数,十位数,个位数
- Netty学习总结(5)——Netty之TCP粘包/拆包问题的解决之道
- C++中实现精度的控制和输出 showpoint<<或者fixed<<setprecision()用法
- oracle--索引--
- 软件技术方案_智慧工地整体解决方案核心系统有哪些?
- win10怎么取消小箭头_已取消到该网页的导航,小编教你网页提示已取消到该网页的导航怎么办...
- java注册用户_用java编程实现用户注册并进行登录操作
- Java中的程序计数器
- mfc100u.dll丢失的解决方法
- 自然语言处理实战——对电影评论进行情感分析(英文)
- itwangyang - 再次继续卷起来-20 个 JS 封装工具函数
- 《逃离禁闭岛》游戏评测:不一样的密室逃脱
- 高质量C++/C 编程指南
- 常见算法之Flood Fill算法
- 红海云签约中国中医药出版社,开启出版行业人力资源数字化新篇章
- 用计算机唱歌弹奏音乐下山,新歌亮相!“要不要买菜”再唱方寸山门派曲《下山》...
- 年过35岁的程序员都去哪儿了?
热门文章
- 在不同的软件中截图的快捷方式
- 2022年智能轨道,交通与运输工程国际会议(ICSTTE 2022)
- IDEA远程调试程序
- html文字上的斜线,如何在WORD的文字上划斜线??
- 苹果7主屏幕计算机什么,iPhone7的屏幕怎么样?iPhone7的屏幕材质是什么?
- 中国商业医疗保险市场趋势报告、技术动态创新及市场预测
- 150℃下使用的无铅焊锡:为车载基板开辟新路(一)
- AJAX发送POST请求
- android 文本框输入 默认文字居中,Android drawText 做到文字绝对居中(示例代码)
- 单片机p0口接8个LED c51语言,51单片机P1口接8个LED灯,低电平点亮,用定时器1定时250ms,让着8个LED不停闪烁,编写完整的C程序。...