zoukankan      html  css  js  c++  java
  • 写代码的规范!!!!

    代码规范
    第一条:考虑用静态工厂方法代替构造器
    原因:静态工厂方法第一大优势它们有名称,第二大优势,不必在每次调用时都创建一个新对象,
    第三优势可以返回原返回类型的任何子类型的对象。
    (冷不丁的想用枚举来做静态工厂实现)
    第四优势在创建参数化类型实例的时候,他们使得代码变得更加简洁。
    缺点当然也有:一:类如果不含共有或者受保护的构造器就不能被子类化,二:与其他静态方法没有区别。
    遵守命名习惯可以弥补这一劣势,比如newtype创建新对象,gettype获取对象
     所以,一般一个静态工厂方法需要有详细的注释,遵守标准的命名,
     如使用getInstance、valueOf、newInstance等方法名;
    第二条:遇到多个构造器参数时要考虑用构造器
    第一中构造就是常见的重叠构造器,一个构造器中this(xxx)调用同名构造器,但是参数过多就容易懵了,
    可以使用无参模式,build生成不可变对象。
    第三条:用私有构造器或枚举类型强化Singleton属性(单例模式)
    第四条:通过私有构造器强化不可实例化的能力
    第五条:避免创建不必要的对象,重用不可变对象
    小心自动拆装箱,要优先使用基本类型而不是装箱基本类型,要当心无意识的自动装箱。
    第6条:消除过期对象的引用:下面例子引用了arraylist的remove方法,
    如果没有将元素置为null的话,就会随着垃圾回收器活动的增加,或者由于内存占用不断增加,程序性能降低会逐渐表现出来。
    
       public E remove(int index) {
            rangeCheck(index);
    
            modCount++;
            E oldValue = elementData(index);
    
            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
    
            return oldValue;
        }

    内存泄漏的另外一个常见来源是缓存,一旦你把对象引用放到缓存中,
    它就很容易被遗忘掉,从而使得它不再有用之后很长时间都保留在缓存之中
    如果你需要这样的缓存那么可以使用这个WeakHashMap,当缓存过期之后就会自动删除。

    // 初始化3个“弱键”
    String w1 = new String("one");
    String w2 = new String("two");
    String w3 = new String("three");
    // 新建WeakHashMap
    Map wmap = new WeakHashMap();
    // 添加键值对
    wmap.put(w1, "w1");
    wmap.put(w2, "w2");
    wmap.put(w3, "w3");
    // 打印出wmap
    // ---- 测试 WeakHashMap 的自动回收特性 ----
    // 将w1设置null。
    // 这意味着“弱键”w1再没有被其它对象引用,调用gc时会回收WeakHashMap中与“w1”对应的键值对
    w1 = null;
    // 内存回收。这里,会回收WeakHashMap中与“w1”对应的键值对
    System.gc();
    System.out.println(wmap.toString());
    System.out.println(wmap.size());
    ==========================================================================
    {three=w3, two=w2} 2
     
    第七条:避免使用终结方法:首先需要强调:终结方法通常是不可预测的,也是很危险的,
    一般情况下是不必要的。使用终结方法会导致行为不稳定,降低性能,以及可移植性问题
    第八条:覆盖equals时请遵守通用约定,equals方法实现了等价关系,自反性,对称性,传递性,一致性。
    第九条:覆盖equals时总要覆盖hashCode
    第十条:始终覆盖toString
    第十一条:谨慎覆盖clone
    第十二条:考虑实现Comparable接口,一旦类实现此接口就可以
    和许多泛型算法以及依赖于该接口的集合实现进行协作。比如按照字母排序,按照数值顺序或年代顺序。
    第十三条:使类和成员的可访问性最小化。一个模块不需要知道其他模块的内部工作情况,这个概念称为信息隐藏或封装。
    第十四条:在公有类中使用访问方法而非公有域(就是私有参数增加公开getset方法)
    第十五条:使可变性最小化
    要实现不可变的类需要满足一下几点要求:
    1、不要提供任何会修改对象状态的方法。(setter方法)
    2、保证类不会被扩展。用final修饰类或者是私有化构造器提供公有静态工厂方法。
    3、使所有的域都是final的。
    4、使所有的域都成为私有的。
    5、确保对于任何可变组件的互斥访问。
    如果类具有指向可变对象的域,则必须确保该类的客户端无法获得指向这些对象的引用。
    并且,永远不要用客户端提供的对象引用来初始化这样的域,
    也不要从任何访问方法中返回该对象的引用。在构造器、访问方法和readObject中请使用保护性拷贝。
    不可变对象本质上是线程安全的,他们不会要求同步。
    第十六条:复合优先于继承,继承打破了封装性,
    子类依赖于超类的特定功能实现细节,超类可能会随着版本不同发生变化,子类也要跟着更新而演变。
    第十七条:要么为继承而设计,并提供文档说明,要么就禁止继承。
    1.文档必须精确描述覆盖每个方法所带来的影响。
    2.为了允许继承,类还必须遵守 其他一些约束,构造器绝不能调用可被覆盖的方法。不论直接还是间接。
    两种方法禁止子类化:类声明为final,另一种所有构造变成私有,或者包级私有,并增加一些共有静态工厂来代替构造器。
    第十八条:接口优于抽象类。
    1.现有的类可以很容易被更新,以实现新的接口。
    2接口是定义混合类型的理想选择。
    3.接口允许我们构造 非层次结构的类型框架。
    第十九条:接口只用于定义类型。
    1.当类实现接口时,接口就充当引用这个实例的类型。
    有一种接口被称为常量接口,如果有非final的类实现了常量接口,
    它的所有子类命名空间也会被接口常量所污染。
    第二十条:类层次优先于标签类。
    第二十一条:用函数对象表示策略。
    第二十二条:优先考虑静态成员类
    嵌套类是指被定义在另一个类的内部的类。
    嵌套类存在的目的应该只是为了它的外围类提供服务。如果嵌套类将来有可能会用于其他的某个环境,它就应该是顶层类。
    嵌套类有四种:静态成员类,非静态成员类,匿名类,局部类。除了第一种,其他三种称为内部类。
    静态成员类是最简单的一种嵌套类。最好把它看做是普通的类,只是碰巧被声明在另一个类的内部而已。
    从语法上来讲,静态成员类和非静态成员类之间唯一的区别是,静态成员类的声明中包含修饰符static。但是静态成员类和非静态成员类之间有
    很大不同。非静态成员类的实例方法内部,可以调用外围类实例(宿主)的方法,或者利用修饰过的this构造获得外围类实例(宿主)的引用。
    静态成员类的实例可以独立于它的外围类的实例之外独立存在。
    非静态成员类的实例不能独立于它的外围类的实例(宿主)独立存在。
    当非静态成员类的实例被创建的时候,它和外围实例之间的关联关系也随之被建立起来,而且这种关联关系以后不能被修改。通常情况下,
    当在外围类的某个实例方法的内部调用非静态成员类的构造器时,这种关联关系被自动建立起来。
    如果声明成员类不需要访问外围实例,就始终要把static修饰符放在它的声明中。
    匿名类不同于Java语言中的其他任何语法单元。匿名内部类没有名字,它不是外围类的一个成员,它并不与其他的成员一起被声明,而是在
    使用的同时被声明和实例化。匿名类可以出现在代码中任何允许存在表达式的地方。匿名类的适用性受到诸多的限制。除了在它们被声明的时候
    之外,是无法将它们实例化的。你无法声明一个匿名类来实现多个接口,或者继承一个类。匿名类的客户端无法调用这个匿名类中的任何方法。
    由于匿名类出现在表达式中,它们,它们必须保持简短-----大约10行或者更少些------否则会影响程序的可读性。
    匿名类的一种常用用法是动态的创建 函数对象。
    匿名类的另一种常见用法是创建 过程对象。
    第二十三条:请不要在新代码中使用原生态类型。

  • 相关阅读:
    WebGL——osg框架学习一
    webgl绘制粗线段
    ThreeJS实现波纹粒子效果
    WebGL——水波纹特效
    WebGL之shaderToy初使用
    有效提升职场竞争力
    Windows结构化异常处理浅析
    一起学习Boost标准库--Boost.StringAlgorithms库
    科学计算工具-Numpy初探
    进程动态拦截注入API HOOK
  • 原文地址:https://www.cnblogs.com/q1359720840/p/10500394.html
Copyright © 2011-2022 走看看