好代码,坏代码

      最近审查一个小项目代码,项目组的成员既有老员工,也有许多新来的本科生。抽一点时间加代码中出现的一些问题总结一下,记录如此,希望给刚入行的新人一点点参考。

      一、书写规范

       sun官方有自己推荐的规范:http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html

       不习惯看英文的可以到网上搜搜中文翻译,新手应该看看,虽然很多不好的习惯无伤大雅。但是有经验的人会用“约定成俗”标准来“看待”我们,再者遵循这些标准,百益而无一害,将来维护的不一定是你,否则将来可能天天有人背后骂你。即使如此,我们还是容易我行我素,常见陋习如下:

      1 、【类有名称,无意义】例:Pkt.java

      2 、【方法名称首字母不小写】

      3 、【类名方法名多个单词连载一起不用驼峰表示】例:systemwarning();推荐:systemWarning();

      4 、【多余变量】一些变量定义了,从未使用,代码提交时候却不清理掉。

      二、含糊的用法

      虽然Java语言,没有非常严格的语法规范,或许正是这一点我们更容易忽略许多细节。

      1、public、private、protected修饰符和访问权限

           priavte          本类可见

           public            所有类可见

           protected      本包和所有子类都可见

           friendly          本包可见(即默认的形式)

      其实在实际应用中,public和private是比较熟悉和好记忆的,主要记住区别protected和friendly两种访问控制修饰符。

      那么在实际应用中,private的类型是在封装的概念上体现较为明显的。private类型的变量都需要通过调用对象的getter和setter方法来访问。为了安全起见,public多适用于构造方法(单对象类除外)、类静态常量等一些形式。

      访问权限修饰符权限从高到低排列是public 、protected 、friendly、 private,有人会所有都有public修饰,以为这样就不会有问题,存在安全隐患。

      2、关键字final、static

      关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。你可能出于两种理解而需要阻止改变:设计或效率。

      final修饰的类不能被继承,没有子类,final类中的方法默认是final的。
      final修饰方法不能被子类的方法覆盖,但可以被继承。
      final修饰成员变量表示常量,只能被赋值一次,赋值后值不再改变。 
      final不能用于修饰构造方法。
      注意:父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。

      关键字static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块。
    static修饰的成员变量和成员方法独立于该类的任何对象。(它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。)
      用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象,不生成static变量的副本,而是类的所有实例共享同一个static变量。
      static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。   
    static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:
      类名.静态方法名(参数列表...)
      类名.静态变量名
      用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块(用处非常大,呵呵)。

      以上2点摘自其他网友文章,这里只是整理一下。

      常见陋习:

      1、

      private final int STORE_FLAG=1;===》private static int STORE_FLAG=1;

      2、浪费内存的构造

      String queryString = new String("from Log u where 1 = 1");===》StringqueryString = "from Log u where 1 = 1"

      3、不好的字符串拼接

          // This is bad
          String s = "";
          for (int i = 0; i < field.length; ++i) {
               s = s + field[i];
          }

         // This is better
        StringBuffer buf = new StringBuffer();
        for (int i = 0; i < field.length; ++i) {
            buf.append(field[i]);
         }
        String s = buf.toString();

       4、无效的trim()

        String ss = xmlcontent;
        ss.trim();===>ss = ss.trim();
        Object[] obj=new Object[]{ss};

       5、变量定义到for循环外部

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值