精华内容
下载资源
问答
  • Java编码规范

    千次阅读 多人点赞 2014-03-13 18:05:16
    先借编码规范之名,行吐槽之实,抱歉。 写干净整洁的代码 阅读代码,眼缘很重要。代码是程序员的脸,保持干净整洁。 记得格式化代码。 建议使用eclipse默认的就行,Ctrl+Shift+F。项目内部格式化风格一定要统一,...

    先借编码规范之名,行吐槽之实,抱歉。

    写干净整洁的代码

    阅读代码,眼缘很重要。代码是程序员的脸,保持干净整洁。

    1. 记得格式化代码
      建议使用eclipse默认的就行,Ctrl+Shift+F。项目内部格式化风格一定要统一,否则svn很难track。鉴于Java开发库以及流行的开源框架都用Block起始大括号不换行风格,Google也如此规范,统一为这种风格。
    2. 去除没有用到的类引用
      纯粹是美观的考量。Google要求import语句里面不允许出现*,更不能引入没有用到的代码。Eclipse里面的快捷键是Ctrl+Shift+O,这个键还能帮忙导入用到的类。
    3. 删掉无用的老代码
      修改代码的时候,有些同学会把老的没有用的代码注释起来,像宝贝一样生怕弄丢,日积月累,注释的代码比有用的代码还多几倍,很难阅读和维护。请删掉它,备份的问题放心的交给SVN或Git。
    4. 删掉IDE帮忙自动生成的无用注释
      TODO Auto-generated method stud等等之流的,请删掉,不解释。
    5. 合理利用空行
      空行的唯一作用是分割逻辑代码,是阅读时候大脑的一个休息区。但是空行又是昂贵的,编辑器一页代码200行以内,使用空行太过奢侈的话,我就光阅读空行了。Google不鼓励多个空行,依我的观点,绝对不能有两个相联的空行,原因简单,浪费可耻,眼睛跳跃也累。当然也反对几十行代码没有一个空行,大脑得累死。总之,优美的代码一定合理的利用了空行,空行都用不好写不出优美的代码。
    6. 想办法把Warning干掉吧
      每一个Warning背后都有一个故事,泛型,未被使用的Class引用,未被使用的private方法,未被使用的field,class cast,序列化等等。搞懂一个Warning背后的故事,优雅的解决掉一个Warning,你就向高手迈进了一步。如果实在是搞不定,注释SuppressWarning能够暴力的帮助你。

    高效运用注释

    有人说注释和代码一样重要,我不太认同。简单优雅的代码比注释更直接易懂,注释会骗人,代码不会,注释不正确比没有注释糟糕很多很多,一大堆无用的注释浪费空间,浪费脑力,不如没有注释。一段关键的算法,一个场景的特殊处理,用简短的注释解释思路,这里注释对于后来的维护人员来说,比代码更加重要。接口的注释是使用接口人员的说明文档,对他们来说也比代码重要。如果一段代码需要你很多很多的注释才能解释清楚,那么请重写那段代码,直到简短注释甚至无需注释。

    1. 给别人调用的接口要注释清楚
      包括Interface、非Java Bean的public方法以及工具类里面的public static方法。关注做什么(不是怎么做),输入输出,特殊情况处理(比如null或不合法参数),异常情况。这种为块级(Block)注释,一般用/** comments */格式。
    2. 特殊的算法简洁清楚地注释
      特殊的算法体现的是作者当时解决问题的思路和算法,具有业务上或者算法上的特殊性,需要备注一下,以防忘记或者其他维护同事难以理解。通常用单行注释即可,特别长的用/* comments */ 格式。
    3. 具有特殊控制意义或者业务意义的变量简洁注释
      主要是帮助阅读代码的时候帮助理解。格式和第二条相同。
    4. 千万别在代码的各个角落留下您的大名或者Ticket单号
      关于名字,请在Class的注释里面加一个@author yourname。阅读代码的时候,只有遇到很烂或者很优雅的代码,我才会去关注作者是谁,通过Class里面的@Author和SVN抑或Git,很轻松的就知道代码出自谁的手。关注代码的时候实在是没有兴趣思考你是谁。至于Ticket单号,提交代码的时候注释就足够了,项目由代码构成,而非Ticket,需要追踪的时候SVN或Git都能够轻松地帮忙搞定。
    5. 块级元素里面慎用多行注释
      可以理解为方法内部慎用多行注释。方法内部应该Focus在代码的实现上,而不是实现的思路,思路请移到方法的注释里面。方法里面的注释应该关注在一些特殊情况处理,程序逻辑的跳转上面,一般单行注释足够胜任。如果方法内部要用大段的注释,还是那句话,请重写。

    命名简洁一致

    命名规范是代码规范的重要一环。总的原则是遵循惯例,简洁,团队甚至个人命名保持一致。

    1. 除了方法用动词,其它的都用名词命名
      项目名,包名,类名,变量名,参数名都用名词命名,方法用动词开始命名。
    2. 按照Java的惯例命名
      包名全小写,每一个文件夹用一个名词命名,注意有且一个词,且长度尽量短一些。类名标准的HelloWorld格式,有人问FBIHelloWorld好呢还是FbiHelloWorld好,我看着后者顺眼,你呢?普通变量,方法名,参数名一律helloWorld,hWorld可不可以?反射的时候有问题,也不好看,建议每一个单词至少两个字母。Final变量HELLO_WORLD,同样不解释。
    3. 简洁即美
      特别强调,简洁不是说鼓励简写,相反简写要慎用,最好团队内部达成共识。我说的简洁是指找那么一个贴切、简短的词或词组来命名。
    4. 命名规范在团队内部保持一致
      A君FBIHelloWorld,B君FbiHelloWorld,C君hWorld,甚至A君混合两种风格,整个项目会显得混乱,难以理解和维护。

    理解Java几个基本的概念

    一些Java的基本概念一定要吃透,否则很容易犯低级错误。

    Exception

    麻烦统计一下你们项目里面处理异常,简单地e.printStackTrace()个数,少不能说明你们项目代码质量一定很高,但太多了一定意味着你们的代码质量不咋地,如果这些烂代码由很多人提交,那更是悲剧。e.printStackTrace()只是把Exception toString(),然后输出到System.err,开发的时候控制台还能显示一下,生产环境到哪里去找。我觉得简单e.printStackTrace()和try catch之后什么都不干一样恶劣。想看报错信息?借助Log4j或者Logback记日志吧,既能开发的时候控制台看到,也能在生产时记录到文件系统。

    • 何时抛出异常
      不正常的场景出现,当前程序决定罢工,并可选择地携带一些错误信息告知调用者,小心,异常。如果你的程序就是最后一环,拜托,别抛了,选择更优雅的方式吧。
    • 何时处理异常
      确定你可以处理那样的异常,并且决定catch之后如何继续下面的操作。catch之后记录日志是标配。如果你开发GUI,你就是最后的消费者,必须处理异常。

    Transaction

    如果你开发的系统要求数据的完整性和准确性,请花些时间好好吃透Transaction。有一个业务Service A,分为两个子Service A1, A2。如果分别调用A1和A2,并放到两个Transaction里面,如果A1执行成功,A2失败并Rollback,请问发生了什么?Service的粒度划分和Transaction的使用非常的重要。

    Thread

    不懂或者半懂不懂千万别用多线程,要用就去好好的了解一下它。依我的理解,多线程仅用在两个地方,性能提升和响应式(Responsive)的GUI界面。

    Access

    两个字,要明确。类,构造函数,属性,方法的访问权限要明确。public, protected,package,private,四个级别,了解不难,用好要功力。有的不喜欢明确定义访问级别的朋友会辩解说,我看JDK里面有的属性或者方法就没有申明权限嘛,JDK的开发工程师也懒。哈哈,往后看看,大多会特别的注释说是package级别的,如果package关键字能够用来定义package权限,他们估计早用了,何必还多写那么些冗余的注释。interface里面不用明确申明public,因为默认就是public的,而且只能是public的。程序员太懒惰不好,太勤快了也不好,难当。

    寻求更好的解决办法(Better Solution)

    项目经理A或业务达人B跑过来,某客户有一个新的需求,请帮忙如此如此改一下系统,如此如此设计。假如你听话马上开始勤奋地敲代码,我觉得90%以上该方案都不是什么好方案。can work与work fine之间有着遥远的距离,改BUG,支持新需求绝对不仅仅是If Else那么简单。套用Linus大神的话,如果A君或者B君比你更了解你的系统,帮你设计由你实现,那么你就没有价值,实现的系统一定很烂,不如A君或者B君直接来实现。大神的徒弟不一定就是大神,传输大都有损耗。找出所谓需求背后的真正动机,结合当前的系统寻求更好的解决方案。何谓更好,各有各的看法,个人觉得,要保持架构风格的统一,要考虑未来类似需求的普适性,要简单准确有效。

    结语

    以上List处于开放状态,欢迎批评,欢迎加内容。一家之言,还请多包涵。

    展开全文
  • java编码规范

    千次阅读 2017-08-31 18:26:30
     本文档以SUN的标准Java代码规范为基础,结合公司的实际需要,做一些修改和补充,编写次文档的目的是规范安信捷开发代码,增加代码清晰度,减少bug,降低后期维护成本和代码审查,养成代码规范的习惯,便于开发人员...

    1章 引言

    1.1介绍

        本文档SUN的标准Java代码规范为基础,结合公司的实际需要做一些修改和补充,编写次文档的目的是规范公司开发代码,增加代码清晰度,减少bug,降低后期维护成本和代码审查,养成代码规范的习惯,便于开发人员自身成长。

     


    第2章  标识符命名

    注:所有标识符不能出现中文,尽量使用通俗英文,不可拼音和英文混用。


    2.1 包名

    全部使用小写字母单词间不要用字符隔开

    正例:com.axj.batchfile

    反例:com.axj.batch_file


    2.2 类名


    2.2.1 类命名

    类名使用驼峰命名,每个自然语义的单词首字母大写,其他字母小写

    正例:SendThread

    反例:sendThreadSendthread


    2.2.2 类后缀

    类名不同的后缀代表不同的类型:

    后缀名

    意义

    举例

     Exception

    这个类是异常类

    Axj Exception

    Service

    表明这个类是个服务类,里面包含了给其他类提同业务服务的方法

    AccountService

    Impl

    这个类是一个实现类,AccountServiceImpl实现AccountService

    AccountServiceImpl

    Test

    日常测试类,以测试名称开头,Test为后缀

    CodeTest

    Enum

    这个类是枚举类,枚举成员名称需要全大写,单词间用下划线隔开

    TimeEnum

    Inter

    这个类是一个接口

    LifeCycleInter

    Dao

    这个类封装了数据访问方法,一般为接口

    PaymentOrderDao

    Action

    直接处理页面请求,管理页面逻辑了类

    UpdateOrderListAction

    Listener

    响应某种事件的类

    PaymentSuccessListener

    Event

    这个类代表了某种事件

    PaymentSuccessEvent

    Servlet

    一个Servlet

    PaymentCallbackServlet

    Factory

    生成某种对象工厂的类

    PaymentOrderFactory

    Adapter

    用来连接某种以前不被支持的对象的类

    DatabaseLogAdapter

    Job

    某种按时间运行的任务

    PaymentOrderCancelJob

    Wrapper

    这是一个包装类,为了给某个类提供没有的能力

    SelectableOrderListWrapper

    Bean

    这是一个POJO

    MenuStateBean

    Thread

    表示是线程类

    SendThread

    POJO

    POJO 类中布尔类型的变量,都不要加 is ,否则部分框架解析会引起序列化错误

     

    Abstract

    抽象类最好能用“Abstract”做为类命名的开头(前缀)

    AbstractBeanFactory


    2.3方法名

    首字母小写,后面自然语义的单词首字母都大写

    正例:closeSession

    反例:CloseSessionclosesession

    动词在前,名词在后

    正例:closeSession

    反例:sessionClose

    方法命名格式(方法名要准确表达业务的含义):

    前缀名

    意义

    举例

    create

    创建

    createOrder()

    delete

    删除

    deleteOrder()

    add

    创建,暗示新创建的对象属于某个集合

    addPaidOrder()

    remove

    删除

    removeOrder()

    init或则initialize

    初始化,暗示会做些诸如获取资源等特殊动作

    initializeObjectPool

    destroy

    销毁,暗示会做些诸如释放资源的特殊动作

    destroyObjectPool

    open

    打开

    openConnection()

    close

    关闭

    closeConnection()<

    read

    读取

    readUserName()

    write

    写入

    writeUserName()

    get

    获得

    getName()

    set

    设置

    setName()

    prepare

    准备

    prepareOrderList()

    copy

    复制

    copyCustomerList()

    modity

    修改

    modifyActualTotalAmount()

    calculate

    数值计算

    calculateCommission()

    do

    执行某个过程或流程

    doOrderCancelJob()

    dispatch

    判断程序流程转向

    dispatchUserRequest()

    start

    开始

    startOrderProcessing()

    stop

    结束

    stopOrderProcessing()

    send

    发送某个消息或事件

    sendOrderPaidMessage()

    receive

    接受消息或时间

    receiveOrderPaidMessgae()

    respond

    响应用户动作

    responseOrderListItemClicked()

    find

    查找对象

    findNewSupplier()

    update

    更新对象

    updateCommission()


    2.4 变量、参数名

    变量一定要清楚表达什么意思,一般取一些通俗有意义的名字,尽量使用简短英文单词。

    命名规则:

    1、首字母小写,后面自然语义的单词首字母都大写

    2、只能以字母、“_”“$”符号作为变量名开头。

    3、变量中可包含数字,但不能以数字开头。

    4、除了“_”“$”符号以外,变量中不能包含其他特殊字符。

    5、不能用classintStringpublicjava关键字做为变量名。

    6、在java中变量名严格区分大小写,例如:nameName就是两个不同的变量

    7、静态变量和枚举类型字母全大写,多个单词之间用”_”分隔,如:TIME_EVENT



    第3章 代码注释


    3.1 注释分类

    注:注释主要分为2种,实现注释和文档注释。


    3.1.1 实现注释

    实现注释使用/*...*///界定,使用/*...*/来进行块注释使用//进行行注释位于注释代码上一行


    3.1.2文档注释

    文档注释描述Java的类、接口、构造器,方法,以及字段(field)。每个文档注释都会被置于注释定界符/**...*/之中,一个注释对应一个类、接口或成员。该注释应位于声明之前javadocj2sdk里面一个非常重要的工具,如果你按照规范在Java的源代码里面写好注释的话,那么它就可以生成相应的文档便于开发者察看Myeclipse生成步骤,点击菜单栏的Project,选择generate javadoc下一步即可。

    javadoc参数定义:

    @author   对类的说明 标明开发该类模块的作者

    @version   对类的说明 标明该类模块的版本

    @see     对类、属性、方法的说明 参考转向,也就是相关主题

    @param    对方法的说明 对方法中某参数的说明

    @return   对方法的说明 对方法返回值的说明

    @exception  对方法的说明 对方法可能抛出的异常进行说明


    3.2 注释条件(必加)

    1、类的注释

    2、方法的注释

    3、在代码复杂处注释

    4、代码修改处注释上时间和修改原因

    5、全局变量注释

    6、在多重嵌套和循环逻辑上注释

    7、接口注释

    8、调用工具类中方法的注释


    3.3 注释举例


    3.3.1 类注释

    /**

     *类功能概述×××××××

     *

     *@author huwei

     *@time 2017-8-20

     */

    public class LogicManager {

    ......

    }


    3.3.2 方法注释

    /**

     * 方法说明×××××××

     *

      * @param1 参数说明

     * @param2 参数说明

      * @return 返回值说明

      * @throws Exception

      */

    public boolean executeLogic(int param1, int param2)throws Exception{

    ......

    return true;

    }


    3.3.3 全局变量、字段、属性注释

    public class ReadManager {

       /** 全局的计数变量*/

       private final int count;

       /** 字段/属性*/

       private String name;

    }


    3.3.4 代码域注释

                /*----------开始:解析数据库数据 ------- */

                //\1拆分数据库数据

                String Row[] = sStr.split("\1");

    waitRecord = new WaitRecord[Row.length];

     

                /* 循环存储对象到List */

    for (int i = 0; i < Row.length; i++) {

    String Col[] = Row[i].split("\2");

    waitRecord[i] = new WaitRecord();

    waitRecord[i].waitId = Col[0];

    waitRecord[i].userId = Col[1];

    waitRecord[i].username = Col[2];

    waitRecord[i].longId = Col[3];

                    waitList.add(waitRecord[i]);

    }

                  /*----------结束:解析数据库数据 ------- */



    第4章  编程实践


    4.1 空行

    空行一般用于分割特定区域代码,表达一段代码,总结为以下几种情况必须换行:

    1、代码注释前得换行

     

    2、两个方法之间换行

     


    3、不同逻辑段之间

     

     

    4、方法里的局部变量和第一条非局部变量代码之间

     

    4.2 换行

    1、一行代码最大不超过120字符,超过则换行

    2、大括号左右,总结如下:

    1左大括号前不换行

    2左大括号后换行

    3右大括号前换行

    4右大括号后面是else或逗号,则不换行否则作为终止符必须换行

    3+号等操作符前换行,逗号后面换行,增加代码可读性

     

    4.3 缩进

    缩进建议采用4个空格作为一个单位,可设置一个tab键为4个空格,一般为开始一个新的块使用缩进,块结束时返回先前的缩进级别(从属关系)。

    4.4 空格

    1、运算符之间使用空格

    正列:a == b ? true : false

    反例:a==b?true:false;

    2、逗号后使用空格,不能在逗号前

    正列:findData(a, b, c);

    反例:finData(a,b ,c);


    第五章 代码习惯

    5.1 异常抛出

    进程和线程可能出现一系列异常,异常的出现如果没有抛出可能会导致进程死掉或线程崩溃,所以需养成异常捕获抛出的习惯,避免应用因进程卡住,异常异常捕获后,需打印异常日志,否则出现异常时不好查找问题。

    5.2 减少嵌套

    代码嵌套层太多,会严重影响代码可读性,处理方法:

    1、使用return跳出,减少else使用

    2、条件使用逻辑运算符(&& ||等)进行拼接

    3、整合成子方法

    5.3 判断字符串相等

    1java中字符串的比较是==比较引用,equals 比较值

    我们经常习惯性的写上if(str1==str2),这种写法在java中可能会带来问题

     例子1String a="abc";String b="abc"

    那么a==b将返回true。因为在java中字符串的值是不可改变的,相同的字符串在内存中只会存

     一份,所以ab指向的是同一个对象;

    例子2String a=new String("abc"); String b=new String("abc");

     那么a==b将返回false,此时ab指向不同的对象。

     2equals方法比较的是字符串的内容是否相同

    exampleString a=new String("abc"); String b=new String("abc"); a.equals(b);将返回true

    通常情况下,为了避免出现上述问题,判断字符串是否相等使用equals方法,具体的原因得引出常量池概念,这里不做详细描述

    5.4 字符串拼接

    拼接字符串尽量使用StringBuffer或者StringBuilder使用+号每次会new一个对象,对空间和性能还是有一定影响的。

    5.5 NPE处理

    java开发最常见的异常就是NPEjava.lang.NullPointerException)异常,需有效的规避异常,进行null判断,可能出现null模块,取集合元素,数据截取,方法返回,socket传输的数据,数据库取值等等...

    5.6 日志输出

    平时调试代码或输出日志习惯使用System.out.println()system.out都写入到一个文件里去了,对一个文件的读写就会排队写而且syso在当前线程,必须写完才继续下面的程序。 如果使用log工具你的日志会发散在多个日志文件上。可以控制日志是否输出而且log工具只是通知要写日志,而不必等日志写完

     

    展开全文
  • Java 编码规范1(编程规约-命名风格) Java 编码规范2(编程规约-常量定义) Java 编码规范3(编程规约-代码格式) Java 编码规范4(编程规约-OOP规约) Java 编码规范5(编程规约-集合处理) Java 编码规范6(编程规约-...

    并发处理


    其它相关文章
    Java 编码规范1(编程规约-命名风格)
    Java 编码规范2(编程规约-常量定义)
    Java 编码规范3(编程规约-代码格式)
    Java 编码规范4(编程规约-OOP规约)
    Java 编码规范5(编程规约-集合处理)
    Java 编码规范6(编程规约-并发处理)
    Java 编码规范7(编程规约-控制语句)
    Java 编码规范8(编程规约-注释规约与其它)
    Java 编码规范9(异常日志)
    Java 编码规范10(单元测试)
    Java 编码规范11(安全规约)
    Java 编码规范12(MySQL-建表规约)
    Java 编码规范13(MySQL-索引规约)
    Java 编码规范14(MySQL-SQL语句与ORM映射)
    Java 编码规范15(工程结构)


    1. [强制] 获取单例对象需要保证线程安全,其中的方法也要保证线程安全。

      • 说明:资源驱动类、工具类、单例工厂类都需要注意。
      • 单例模式推荐使用双重锁检查实现,最好使用内部静态类实现。
    2. [强制] 创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。

      • 正例:

        public class TimerTaskThread extends Thread {
            public TimerTaskThread() {
                super.setName("TimerTaskThread");
                ...
            }
            ...
    3. [强制] 线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。

      • 说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。
    4. [强制] 线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor的方式,这样的处理方式让写同学更加明确线程池运行规则,避资源耗尽风险。

      • FixedThreadPoolSingleThreadPoolPool : 允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。
      • CachedThreadPoolScheduledThreadPool : 允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。
    5. [强制] SimpleDateFormat 是线程不安全的类,一般不要定义为static变量。

      • 如果定义为static,必须加锁,或者使用DateUtils工具类。
      • 正例:注意线程安全,使用DateUtils。亦推荐如下处理:

      private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() {
          @Override
          protected DateFormat initialValue() {
              return new SimpleDateFormat("yyyy-MM-dd");
          }
      };
    6. 说明: 如果是JDK8的应用,可以使用Instant代替DateLocalDateTime代替CalendarDateTimeFormatter代替SimpleDateFormat,官方给出的解释:

      simple beautiful strong immutable thread-safe。

    7. [强制] 高并发时,同步调用应该去考量锁的性能损耗。

      • 能用无锁数据结构,就不要用锁;
      • 能锁区块,就不要锁整个方法体;
      • 能用对象锁,就不要用类锁。
      • 尽可能使加锁的代码块工作量尽可能的小,避免在锁代码块中调用RPC方法。
    8. [强制] 对多个资源、数据库表、对象同时加锁时,需要保持一致的加锁顺序,否则可能会造成死锁。

      • 说明: 线程一需要对表A、B、C依次全部加锁后才可以进行更新操作,那么线程二的加锁顺序也必须是A、B、C,否则可能出现死锁。
    9. [强制] 并发修改同一记录时,避免更新丢失,需要加锁。要么在应用层加锁,要么在缓存加锁,要么在数据库层使用乐观锁,使用version作为更新依据。

      • 如果每次访问冲突概率小于20%,推荐使用乐观锁,否则使用悲观锁。乐观锁的重试次数不得小于3次。
    10. [强制] 多线程并行处理定时任务时,Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常,其它任务便会自动终止运行,使用ScheduledExecutorService则没有这个问题。

    11. [推荐] 使用CountDownLatch进行异步转同步操作,每个线程退出前必须调用countDown方法,线程执行代码注意catch异常,确保countDown方法被执行到,避免主线程无法执行至await方法,直到超时才返回结果。

      • 注意,子线程抛出异常堆栈,不能在主线程try-catch到。
    12. [推荐] 避免Random实例被多线程使用,虽然共享该实例是线程安全的,但会因竞争同一seed导致性能下降。

      • Random实例包括java.util.Random 的实例或者 Math.random()的方式。
      • 正例: 在JDK7之后,可以直接使用API ThreadLocalRandom,而在JDK7之前,需要编码保证每个线程持有一个实例。
    13. [推荐] 在并发场景下,通过双重检查锁(double-checked locking)实现延迟初始化的优化问题隐患(可参考 The “Double-Checked Locking is Broken” Declaration),推荐解决方案中较为简单一种(适用于JDK5及以上版本),将目标属性声明为 volatile 型。

      • 反例:

        class Singleton {
            private Helper helper = null;
            public Helper getHelper() {
                //只有一次锁检查
                if (helper == null) synchronized(this) {
                    if (helper == null)
                        helper = new Helper();
                }
                return helper;
            }
            // other methods and fields...
        }
    14. [参考] 使用volatile解决多线程内存不可见问题。

      • 对于一写多读,是可以解决变量同步问题,但是如果多写,同样无法解决线程安全问题。
      • 如果是count++操作,使用如下类实现:AtomicInteger count = new AtomicInteger(); count.addAndGet(1);
      • 如果是JDK8,推荐使用LongAdder对象,比AtomicLong性能更好(减少乐观锁的重试次数)。
    15. [参考] HashMap在容量不够进行resize时由于高并发可能出现死链,导致CPU飙升,在开发过程中可以使用其它数据结构或加锁来规避此风险。

    16. [参考] ThreadLocal无法解决共享对象的更新问题,ThreadLocal对象建议使用static修饰。

      • 这个变量是针对一个线程内所有操作共享的,所以设置为静态变量,所有此类实例共享此静态变量,也就是说在类第一次被使用时装载,只分配一块存储空间,所有此类的对象(只要是这个线程内定义的)都可以操控这个变量。
    展开全文
  • 一、java文件组织 文件组织规则:由于超过2000行的程序难以阅读,应该尽量避免出现超过2000行的程序。一个Java源文件都包含一个单一的公共类或接口。若私有类和接口与一个公共类相关联,可以将它们和公共类放入同一...

    一、java文件组织

    文件组织规则:由于超过2000行的程序难以阅读,应该尽量避免出现超过2000行的程序。一个Java源文件都包含一个单一的公共类或接口。若私有类和接口与一个公共类相关联,可以将它们和公共类放入同一个源文件。公共类必须是这个文件中的第一个类或接口。

    文件组织顺序

    1.文件注释:所有的源文件都应该在开头有一个注释,其中列出文件的版权声明、文件名、功能描述以及创建、修改记录:

    2.包和引入语句:在多数Java源文件中,第一个非注释行是包语句。在它之后可以跟导包语句

    3. 类或接口注释:采用JavaDoc文档注释,在类、接口定义之前应当对其进行注释,包括类、接口的描述、最新修改者、版本号、参考链接等;

    注:JavaDoc文档注释:描述Java的类、接口、构造方法、方法、以及字段。每个文档注释都会被置于注释定界符/**...*/之中,一个注释对应一个类、接口或成员。该注释应位于声明之前。文档注释的第一行(/**)不需缩进,随后的文档注释每行都缩进1格(使星号纵向对齐)。

    4. 类或接口的声明

    5. 类或接口的实现注释:如果有关类或接口的信息不适合作为“类或接口文档注释”,可以在类或接口的实现注释中给出;

    6. 类的(静态)变量:首先是类的公共变量,随后是保护变量,再后是包一级别的变量(没有访问修饰符),最后是私有变量;

    7. 实例变量:首先是公共级别的,随后是保护级别的,再后是包一级别的(没有访问修饰符),最后是私有级别的;

    8. 构造方法;

    9. 普通方法:方法应该按功能分组,而不应该按作用域或访问权限进行分组。

    二、代码风格

          1.缩进:程序块要采用缩进风格编写,缩进只使用TAB键,不能使用空格键(编辑器中请将TAB设置为4格);方法体的开始、类的定义、以及iffordowhileswitchcase语句中的代码都要采用缩进方式;

          2.对齐:程序块的分界符左大括号"{" 和右大括号"}"都另起一行,应各独占一行并且位于同一列,同时与引用它们的语句左对齐;对齐只使用TAB键,不使用空格键;不允许把多个短语句写在一行中,即一行只写一条语句;iffordowhilecaseswitchdefault等语句自占一行。

          3.换行:一行的长度超过80个字符需要换行,换行规则如下:

    在一个逗号后面断开;

    在一个操作符前面断开;

    长表达式要在低优先级操作符处划分新行;

    新行缩进2个TAB。

    4.间隔:类、方法及相对独立的程序块之间、变量说明之后必须加空行;关键字之后要留空格, ifforwhile  等关键字之后应留一个空格再跟左括号"(", 以突出关键字;方法名与其左括号"("之间不要留空格, 以与关键字区别;二元操作符如   " ="、" +="  " >="、" <="、" +"、" *"、" %"、" &&"、" ||"、" <<" ," ^" 等的前后应当加空格;一元操作符如" !"、" ~"、" ++"、" --"等前后不加空格;xiang"[ ]"、" ." 这类操作符前后不加空格;for语句中的表达式应该被空格分开;强制转型后应该跟一个空格。

    三、注释

    1.原则:对已经不推荐使用的类和方法需要注明@Deprecated,并说明替代的类或者方法;对于针对集合、开关的方法,要在方法注释中表明是否多线程安全。

    2.字段注释: 采用JavaDoc文档注释,定义为public的字段必需给出注释,在类的(静态)变量、实例变量定义之前当对其进行注释,给出该字段的描述等:

    3.方法注释:采用JavaDoc文档注释,在方法定义之前当对其进行注释,包括方法的描述、输入、输出及返回值说明、抛出异常说明、参考链接等:

    4.单行注释格式//

    6.多行注释格式/*……*/

    三、命名规则

    1.基本规则:使用可以准确说明变量、字段、类、接口、包等完整的英文描述符;采用大小写混合,提高名字的可读性;采用该领域的术语;尽量少用缩写,但如果一定要使用,当使用公共缩写和习惯缩写等;避免使用相似或者仅在大小写上有区别的名字。

    2.包命名:包名一律小写, 少用缩写和长名;采用以下规则:

                                      [基本包].[项目名].[模块名].[子模块名]...

    不得将类直接定义在基本包下,所有项目中的类、接口等都应当定义在各自的项目和模块包中。

    3.类或接口命名:类或接口名是个一名词,采用大小写混合的方式,每个单词的首字母大写。尽量使你的类名简洁而富于描述。使用完整单词,避免用缩写词(除非该缩写词被更广泛使用,像URL,HTML)。

    4.变量命名: 采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写;变量名不应以下划线或美元符号开头;尽量避免单个字符的变量名,除非是一次性的临时变量。临时变量通常被取名为i,j,k,m和n,它们一般用于整型;c,d,e,它们一般用于字符型;不采用匈牙利命名法则,对不易清楚识别出该变量类型的变量应使用类型名或类型名缩写作其后缀;组件或部件变量使用其类型名或类型名缩写作其后缀;集合类型变量,例如数组和矢量,应采用复数命名或使用表示该集合的名词做后缀。

    5.常量命名:全部采用大写,单词间用下划线隔开。

    6.方法命名:方法名是一个动词,采用大小写混合的方式,第一个单词的首字母小写,其后单词的首字母大写;取值类可使用get前缀,设值类可使用set前缀,判断类可使用is(has)前缀。

    四、声明

    1.类或接口的声名:类、接口定义语法规范如下

    [可见性][('abstract'|'final')] [Class|Interface] class_name

    [('extends'|'implements')][父类或接口名]{

    //方法体

    }

    2.方法声明:良好的程序设计应该尽可能减小类与类之间耦合,所遵循的经验法则是:尽量限制成员函数的可见性。如果成员函数没必要公有 (public),就定义为保护 (protected);没必要保护 (protected),就定义为私有 (private);方法定义语法规范:

    [可见性]['abstract'] [‘static’] ['final'] ['synchronized'][返回值类型] method_name(参数列表)[('throws')][异常列表]{

    //方法体

    }

    声明顺序:构造方法、静态公共方法、静态私有方法、公共方法、友元方法、受保护方法、私有方法、main方法;方法参数建议顺序:(被操作者,操作内容,操作标志,其他)。

    3.变量声明:一行一个声明;声明局部变量的同时初始化(在变量的初始值依赖于某些先前发生的计算的特殊情况下可以不用同时初始化);只在代码块的开始处声明变量,(一个块是指任何被包含在大括号"{"和"}"中间的代码)不要在首次用到该变量时才声明;避免声明的局部变量覆盖上一级声明的变量,即不要在内部代码块中声明相同的变量名;公共和保护的可见性应当尽量避免,所有的字段都建议置为私有,由获取和设置成员函数(Getter、Setter)访问;定义一个变量或者常量的时候,不要包含包名(类似java.security.MessageDigest digest = null),除非是两个包有相同的类名;数组声明时应当将"[]"跟在类型后,而不是字段名后;声明顺序:常量、类变量、实例变量、公有字段、受保护字段、友元字段、私有字段。

    五、异常

          1.捕捉异常的目的是为了处理它

          2. 多个异常应分别捕捉并处理,避免使用一个单一的catch来处理。

    六、习惯

    1. if、for、do、while等语句的执行语句部分无论多少都要加括号"{}"

    2. 每当一个case顺着往下执行时(因为没有break语句),通常应在break语句的位置添加注释;

    3. 尽量避免在循环中构造和释放对象

    4. 在使用局部变量的过程,按就近原则处理。不允许定义一个局部变量,然后在很远的地方才使用;

    5.相同的功能不允许复制成N份代码;

    6. 在处理 String 的时候要尽量使用 StringBuffer 类。

    展开全文
  • 《阿里JAVA编码规范》读后笔记

    千次阅读 2017-07-31 19:36:44
    正所谓脑袋空空,口袋空空,坚持每天学一点东西,坚持每天记录所见所学 :P这两天耐着性子把《阿里JAVA编码规范》看完了,觉得收获良,先记载下自己的学习笔记,等抽空了再尝试把里面的内容结构化一下方便以后速查...
  • JAVA编码规范

    千次阅读 2006-12-13 13:11:00
    JAVA 编码标准规范 一、JAVA编码标准规则1. JavaBeans [BEAN]2. 编码约定/ 惯例Coding Conventions [CODSTA]3. 契约设计/ Design by Contract [DBC]4. Enterprise JavaBeans [EJB]5. 异常/ Exceptions [EXCEPT...
  • Java编码规范总结(腾讯+阿里)

    万次阅读 多人点赞 2019-05-06 20:28:03
    Java编码规范总结(参考腾讯编码规范) 一、java文件组织 文件组织规则:由于超过2000行的程序难以阅读,应该尽量避免出现超过2000行的程序。一个Java源文件都包含一个单一的公共类或接口。若私有类和接口与一个...
  • JAVA多线程并发

    千次阅读 多人点赞 2019-09-18 12:14:29
    JAVA多线程并发1 JAVA并发知识库2 JAVA 线程实现/创建方式2.1 继承 Thread 类2.2 实现 Runnable 接口2.3 Callable 、Future 、ExecutorService 有返回值线程2.4 基于线程池的方式2.4.1 4种线程池2.4.1.1 ...
  • java编码规范及优化总结

    千次阅读 2016-05-17 08:56:02
    一、java概述 1991 年Sun公司的James Gosling(詹姆斯·高斯林)等人开始开发名称为 Oak 的语言,希望用于控制嵌入在有线电视交换盒、PDA等的微处理器。1994年将Oak语言更名为Java。  二、Java的三种技术...
  • Java编码规范及代码性能优化   1.尽量使用final修饰符。 2.尽量重用对象。 3.尽量使用局部变量。 4.不要重复初始化变量。 5.不用new关键字创建对象的实例。 6.java编程过程中,进行数据库连接,I/O流操作...
  • Java编码规范】写不好规范的Java代码怎么去大厂

    千次阅读 多人点赞 2020-03-15 08:12:54
    构造器参数太怎么办2. 123参考 1. 构造器参数太怎么办 解决办法 :引入Builder模式 场景:当构造器有5个或者以上的构造参数时或者目前参数不但是以后会不断增多的时候。 demo 如下: public class Computer {...
  • java性能编码规范整理二

    千次阅读 2012-06-14 23:57:37
    接上篇 java性能编码规范整理一 12、对于高频度使用的对象,需要进行单独优化处理给以重用13、在代码开发中,需要根据应用场景合理选择集合框架中的集合类,应用场景可按单线程和多线程来划分,也可按频繁插入、...
  • Java代码编码规范(1)

    千次阅读 2015-09-17 17:16:36
    Java代码编码规范 第一部分:Convention(编码约定)1.右括号放在一行的开始 Noncompliant Code Example if(condition) { doSomething();} Compliant Solution if(condition) { doSomething(); } 2.抽象...
  • 如果我们在多线程中引入了共享变量,那么我们就需要考虑一下多线程下线程安全的问题了。那么我们在编写代码的过程中,需要注意哪些线程安全的问题呢?一起来看看吧。大家都做过方法重写,我们知道方法重写是不会检查...
  • java多线程应用

    万次阅读 2019-02-13 13:33:59
    线程,有时被称为轻量进程... 线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的...
  • JAVA编码规范--性能与可靠性

    千次阅读 2013-01-24 14:10:36
    说明:由于存在多线程访问情况,所以要求单例的获取实例方法加上同步标志,如下:   /**   * 单实例   * @return TEBoardOnLineEvent   */   public synchronized static ...
  • Java多线程安全原理

    千次阅读 2017-09-08 15:27:57
    在学习的过程中,也总结下对多线程的理解。JVM的内存区域解释这个问题之前,先看下JVM(java虚拟机)运行时的数据区域的划分: 图中的这些区域都有各自的用途以及生命周期,简单了解下: 方法区:Method Area是各个...
  • JAVA安全编码规范

    千次阅读 2019-05-13 01:03:00
    java线程安全规范 一般用同步方法、同步代码块来锁定对象 private Lock lock = new ReentrantLock(); 先用lock.lock()方法锁,在finally代码块中调unlock方法进行解锁 ====以上都为即兴发挥,不对之处感谢指出==...
  • java多线程开发

    千次阅读 2013-09-06 09:55:13
    多线程将一个运行程序分为多个执行体,在并行计算的处理器中交替运行,多个线程可以同时处理相同的编码和数据,也可以处理不同的编码和数据,以实现计算机的并行计算。多线程Java语言的一大特性,运行多线程机制...
  • JAVA多线程和线程池

    千次阅读 2019-08-25 11:06:12
    1、线程状态 (1) 新建状态 (2) 就绪状态 (3) 运行状态 (4) 阻塞状态 (5) 死亡状态 2、线程优先级 3、同步工具synchronized、wait、notify 4、创建线程 (1) 实现 Runnable 接口 (2) 继承 Thread 类 (3) ...
  • 前面花了很时间把线程池的核心容器和主要核心流程源码大概的分析了一遍,如果有认真看了的话相信,一定对于线程池有了较深的理解,ThreadPoolExecutor是线程池框架的一个核心类,通过对ThreadPoolExecutor的分析,...
  • JAVA-编码规范-代码风格-命名

    千次阅读 2015-09-23 11:10:34
    多java规范,内容偏向于对排版的要求,对java语言特性使用上的注意事项描述较少,为了能帮助我们合理的使用java语言,规避语言陷阱,特发此专题博客。 代码总体原则: 1:清晰第一。清晰性是易于维护,易于重构的...
  • 【安全开发】java安全编码规范

    千次阅读 多人点赞 2018-11-30 15:44:00
    原文转载自:https://github.com/SecurityPaper/SecurityPaper-web/blob/master/_posts/2.SDL%E8%A7%84%E8%8C%83%E6%96%87%E6%A1%A3/2018-08-17-SDL-3-java%E5%AE%89%E5%85%A8%E7%BC%96%E7%A0%81%E8%A7%84...
  • java(7)-多线程和线程池

    千次阅读 2012-09-05 14:53:17
    一.Java实现多线程的三种方式 先简单看看java多线程如何实现的: 1、继承Thread类 让自己的类继承 Thread 类: public class Test extends Thread { public static void main(String[] args) { Thread t = n....
  • Java多线程编程-(1)-线程安全和锁Synchronized概念 Java多线程编程-(2)-可重入锁以及Synchronized的其他基本特性 Java多线程编程-(3)-线程本地ThreadLocal的介绍与使用 Java多线程编程-(4)-线程间通信...
  • 目录一, JAVA 多线程并发1,JAVA 并发知识库2,JAVA 线程实现/创建方式(1) 继承 Thread 类(2)实现 Runnable 接口。(3)ExecutorService、Callable、Future 有返回值线程(4)基于线程池的方式(5)4 种线程池...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 58,645
精华内容 23,458
关键字:

java编码规范多线程

java 订阅