源文件基本设置

1. 文件名

驼峰标识,.java结尾

2. 编码

统一为UTF-8

Transport...可以解决property文件不能正常显示为中文的问题

3. 特殊字符

  • 尽量使用转义字符(\t, \n等),而不是八进制的(\012)或者Unicode转义(\u000a)
  • 非ascii字符,最容易理解,使用unicode字符,比如:μ,不使用转义:\u03bcs

源文件结构

  • license
  • package
  • import
  • 一个主类

每一个部分之间用一个空行隔开

1. license

2. 包名

不换行(line-wrapped),一行写完

3. import

  • import的时候不使用通配符*
  • 不单独区分jdk的import和其他import,只按照静态引用和非静态引用分块
  • 静态引用、非静态引用之间用空行分开,各自的块中间没有空行

4. 类

  • 一个文件只有一个top-level类

格式

1. 大括号(braces)

  • If,lese,if else,for,do,while,这些语句块都要用大括号
  • 这些关键字后面的左大括号前面要有空格(没有换行),后面换行,右大括号前后都需要换行(如果右大括号后面有一些特殊的语句块的时候不需要换行,如:else,catch)
  • 如果语句块是空的,可以简写
  // This is acceptable
void doNothing() {} // This is equally acceptable
void doNothingElse() {
}
// This is not acceptable: No concise empty blocks in a multi-block statement
try {
doSomething();
} catch (Exception e) {}

2. 块缩进

4个空格

3. 每行一个声明

  • 变量不要连续声明
  • 每行一个语句(一个分号)

4. 列长限制120

列外情况:

  1. 不可能遵守的这个规则的情况(比如:URL)
  2. package、import
  3. 注释里面的会被拷贝粘贴到命令行里运行的命令

5. 折行(line-wrapping)

1. 什么时候折行?

究竟应该在哪里折行?随性,一个主要的指导是:最好在语法层面上折行

  1. 如果折行的地方正好是非等号运算符,则在运算符前面折行,包括类似运算符的符号,比如:

    • 点运算符,"."
    • 泛型,""
  2. 如果折行的地方正好是等号运算符,则在符号后面折行,包括类似等号运算符,比如:
    • foreach的":"
  3. 方法或者构造方法的名字和左括号("(")最好在一行,即方法的左括号后折行
  4. 逗号(",")和他前面的部分在一行,逗号后折行
  5. lamda的箭头后面(的"{")不换行,除非j方法体部分不需要大括号
MyLambda<String, Long, Object> lambda =
(String label, Long value, Object obj) -> {
...
}; Predicate<String> predicate = str ->
longExpressionInvolving(str);

2. 有折行时候的缩进

  • 有折行的情况下,每次折行都至少缩进4个空格(相较于第一行)
  • 如果多次缩进是语法上并行的元素,那么可以缩进相同,否则在持续缩进中,每次都要增加4个空格
  • 没有必要为了水平对齐而增加额外的空格

6. 空白

  1. 垂直的空白

    1. 字段、构造方法、成员方法、内部类、静态初始化、实例初始化,这些之间用空行隔开

      1. 成员字段之间不用空行,除非为了逻辑上的分组
      2. enum字段之间用空行隔开
    2. 为了组织代码而进行逻辑分割可以使用空行
    3. 类第一个成员前面不需要空行,最后一个成员后面也不需要空行
  2. 水平空白

    1. 关键字后面的小括号("(")之间要有一个空格作为分隔,if,for,catch

    2. 关键字前面的大括号("}")之间要有一个空格作为分隔,else, catch

    3. 左大括号("{")前面要有一个空格,两个例外:

      1. @SomeAnnotation({a, b}) (no space is used)
      2. String[][] x = {{"foo"}}; (no space is required between {{)
    4. 二元或者三元运算符前后都要有空格,包括类似运算符的符号,如:

      1. 泛型中,<T extends Foo & Bar>
      2. foreach中":"前后
      3. lamda表达式的"->"前后

      但是不包括:

      1. 点运算符"."
    5. ,:;后面有空格,还有强转的右括号后面")"

    6. 行末注释"//"两侧都需要空格,多个是允许的,但不是必须的

    7. 在变量类型和声明之间:List list

    8. 数组初始化的大括号里面,左大括号后面和右大括号前面的空格不是必须的

    new int[] {5, 6} and new int[] { 5, 6 } are both valid

  3. 水平对齐所需要的空白:不需要

增加维护成本

7. 加上分组用的小括号

便于理解运算顺序,而不必记住Java优先级表

8. 特定的一些构造

  1. enum

    如果元素有构造方法或者一般方法的情况,元素之间可以用空行隔开

    private enum Answer {
    YES {
    @Override public String toString() {
    return "yes";
    }
    }, NO,
    MAYBE
    }

​ 如果没有构造方法等可以用下面的方式

private enum Suit { CLUBS, HEARTS, SPADES, DIAMONDS }
  1. 变量声明

    1. 一次声明一个变量,不要出现如int a, b;
    2. 局部变量在必要的还是再声明,保证最小化生命周期
  2. 数组

    1. 数组初始化可以当做一个block,例如:
    new int[] {           new int[] {
    0, 1, 2, 3 0,
    } 1,
    2,
    new int[] { 3,
    0, 1, }
    2, 3
    } new int[]
    {0, 1, 2, 3}
    1. 方括号跟在类型后面,方括号和类型共同组成一个类型,String[] arr,而不是String arr[]
  3. switch语句

    1. case缩进4个空格
    2. 冒号后换行
    3. 有穿透的(case没有break)还是要说明,注释
    4. 保留default,即使没有代码
  4. 注解

    1. 一个注解单独一行
  5. 注释

    多行注释中第一行和最后一行不写注释

    /*
    * This is // And so /* Or you can
    * okay. // is this. * even do this. */
    */

  6. 修饰词

    Java中修饰词的顺序

    public protected private abstract default static final transient volatile synchronized native strictfp
  7. 数字字面值

    如果是long类型的字面值,最后加"L",而不是"l",如:long length = 1000L;

命名

1. 通用的命名规则

仅仅使用ascii字符和数字,少数情况使用下划线(比如:常量命名,大写,多个单词之间使用下划线隔开)

2. 每种标识符对应的命名规则

  1. package:全小写,不使用下划线

  2. class:

    1. 使用首字母大写的驼峰标识
    2. 类名使用名词或者名词短语,接口使用名词或者名词短语,部分情况使用形容词(Readable)
    3. 注解没有指定的规则
    4. 测试类,<被测试的类名>+Test
  3. method:

    1. 方法名首字母小写的驼峰标识
    2. 方法名是动词或者动词短语
    3. 测试方法名称:test+<被测试的方法名>+
  4. constant:

    1. 全大写,单词之间用下划线隔开
    2. 名词或者名词短语
    3. 怎么才算常量:
      1. static final修饰的原始类型、String、不可变的集合
      2. 对象所有可被访问的状态不可变
  5. 非常量字段命名

    1. 首字母小写,驼峰标识
    2. 名词或者名词短语
  6. 形参名

    1. 首字母小写,驼峰标识
    2. public方法的参数名不能只有一个字母
  7. 局部变量命名

    1. 首字母小写的驼峰标识
    2. 局部变量即使是不可变的,也不能按照常量的方法来命名
  8. 泛型参数

    下面两种方式中选一个

    1. 单个大写字母后面跟上数字
    2. 若泛型有上限,则上限类名后面跟上大写的T

3. 驼峰标识的具体方法

怎么将多个单词或者单词短语转换为驼峰标识的命名方法

  1. 将所有的单词或者短语转换为ascii,并且删除中间的任何撇号,如:"Müller's algorithm"转换为 "Muellers algorithm"。
  2. 将上面得到的划分为单词,使用空格或者标点符号(特别是连字符)作为分界线。如果一个短语有惯常用法,则保留惯常用法,比如:AdWords 转换为Ad Words
  3. 将得到的字符串全部转换为小写,然后将划分后的每一个单词的首字母大写(如果是第一个单词则可能第一个单词的首字母小写)
  4. 然后将字符串连接起来,去掉空格

一些例子:

需要转换的字符串 正确的 不正确的
"XML HTTP request" XmlHttpRequest XMLHTTPRequest
"new customer ID" newCustomerId newCustomerID
"inner stopwatch" innerStopwatch innerStopWatch
"supports IPv6 on iOS?" supportsIpv6OnIos supportsIPv6OnIOS
"YouTube importer" YouTubeImporter YoutubeImporter

编程实践

1. 总是写@Override

2. 不忽略任何异常

需要catch异常,并做处理,如果没有必要处理,要用注释说明

3. 使用类名来引用静态成员

4. 不重写Object.finalize

如果非要重写,请阅读并理解《Effective Java》里面避免Finalizer的部分

其他在idea中的设置

换行符

统一为"\n"

缩进

统一为:tab 4 个空格

参考

Google Java Style Guide

Java代码风格和在idea中的一些设置的更多相关文章

  1. 如何通过 Java 代码隐藏 Word 文档中的指定段落

    在编辑Word文档时,我们有时需要将一些重要信息保密. 因此,可以隐藏它们以确保机密性. 在本文中,将向您介绍如何通过 Java 程序中的代码隐藏 Word 文档中的特定段落.下面是我整理的具体步骤, ...

  2. Google java代码风格导入Eclipse

    Git地址 https://github.com/codeset/google-java-styleguide 下载配置文件在Eclipse中执行导入:Window -> Preferences ...

  3. [改善Java代码]不要在finally块中处理返回值

    在finally代码块中处理返回值,这是在面试题中经常出现的题目.但是在项目中绝对不能再finally代码块中出现return语句,这是因为这种处理方式非常容易产生"误解",会严重 ...

  4. Java 代码学习之理解数据类型中的坑

    package dailytest; import org.junit.Test; public class DataTypeTest { /** * 当有字符串第一次参与运算后,+成了连接符的作用 ...

  5. java代码实现对excel加密、解密(设置或去除打开密码)

    使用jxcell组件来完成对excel加密.解密的功能. jxcell.jar[点击下载](此jar没有使用限制,你懂得) 具体代码如下: import java.io.IOException; im ...

  6. 在Python程序中调用Java代码的实现

    <原创不易,转载请标明出处:https://www.cnblogs.com/bandaobudaoweng/p/10785766.html> 前言 开发Python程序,需求中需要用到Ja ...

  7. 【HBase】通过Java代码实现HBase数据库中数据的增删改查

    目录 创建maven工程,导入jar包 java代码实现创建hbase表 java代码实现向hbase表中插入数据 java代码查询hbase数据 使用rowKey查询指定列族指定列的值 通过star ...

  8. Visual Studio 代码风格约束

    团队内部若能统一代码风格对于日后的项目维护大有裨益,但面对厚达十几甚至几十页的代码风格规范,开发人员难免产生抵触心理.Python和Go等在语言层面就对代码风格作了一定的约束,但C#并没有,为解决这个 ...

  9. java代码打包成jar以及转换为exe

    教你如何把java代码打包成jar文件以及转换为exe可执行文件 1.背景: 学习java时,教材中关于如题问题,只有一小节说明,而且要自己写麻烦的配置文件,最终结果却只能转换为jar文件.实在是心有 ...

随机推荐

  1. 【LightOJ1282】Leading and Trailing(数论)

    [LightOJ1282]Leading and Trailing(数论) 题面 Vjudge 给定两个数n,k 求n^k的前三位和最后三位 题解 这题..真的就是搞笑的 第二问,直接输出快速幂\(m ...

  2. djang-tastypie学习整理

    quick start: 配置环境(pip install: Python 2.7+ or Python 3.4+ Django 1.8+ python-mimeparse 0.1.4+ (http: ...

  3. angular采坑记录

    在angular中会遇到一些莫名的问题,导致不能完成想要的功能,可能是某项用法使用错误,或许是angular相对应不支持,或者是我们功力根本就没有达到.为了在每次采坑之后能有所收获,再遇到时能理解其根 ...

  4. Bounding-box 回归

    R-CNN系列均训练了Bounding-box回归器来对窗口进行校正,其目标是学习一种转换关系将预测得到的窗口P映射为真实窗口G(Ground truth). 变换方式 可以通过简单的仿射变换以及指数 ...

  5. Oracle闪回恢复

    Oracle的闪回功能包括 1.闪回数据库(前提 归档模式下 启用闪回数据库) mount 下 alter database archivelog; alter database flashback ...

  6. 分布式日志收集系统:Flume

    Flume知识点: Event 是一行一行的数据 1.flume是分布式的日志收集系统,把收集来的数据传送到目的地去. 2.flume里面有个核心概念,叫做agent.agent是一个java进程,运 ...

  7. RESTful接口设计原则和优点

    RESTful架构优点: 前后端分离,减少流量 安全问题集中在接口上,由于接受json格式,防止了注入型等安全问题 前端无关化,后端只负责数据处理,前端表现方式可以是任何前端语言(android,io ...

  8. 关于Android SDK Manager无法更新的解决办法

    网上其实也提供了很多的解决方法,但是很多方法下载已经失效了,这里我提供一个解决方法: 1.打开SDK Manager,点击Tools-Options... 2.做如下修改: (这张图片是参考其他网站的 ...

  9. Python进阶_类与实例

    上一节将到面对对象必须先抽象模型,之后直接利用模型.这一节我们来具体理解一下这句话的意思. 面对对象最重要的概念就是类(class)和实例(instance),必须牢记类是抽象的模板,比如studen ...

  10. 关于MD5+salt盐加密

    MD5+salt 最近浏览浏览一些帖子时,发现曾经引以为傲的md5加密算法,虽然是无法解密的算法,但是现在可以通过FELHELP(谷歌浏览器插件)或者一些字典可以套出来,.但是当md5+salt值时, ...