`
jinghuainfo
  • 浏览: 1520195 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

WebGame服务器Java编码技巧版本1.0

 
阅读更多
一.常用技巧

    1. 避免使用不易理解的数字,用有意义的常量来代替。

    2. 不要使用难懂的技巧性很高的语句。

    3. 在处理String的时候,推荐使用StringBuffer类。

     String 类将 StringBuffer 类封装了起来,(以花费更多时间为代价)为开发人员提供了一个安全的接口。当我们在构造字符串的时候,我们应该用 StringBuffer 来实现大部分的工作,当工作完成后将 StringBuffer 对象再转换为需要的 String 对象。如果用 String 对象代替 StringBuffer 对象的话,会花费许多不必要的创建和释放对象的 CPU 时间。  
      ○   StringBuffer description = new StringBuffer();

    ○   description.append(str1).append(str2) .append(str3);

    ○   model.setDescription(description.toString());

    ×   String description = “”;

    ×   description = str1 + str2 + str3;

    ×   model.setDescription(description);
    但是在上述例子中,如果被拼接的对象是静态常量的话,直接使用“ + ”来拼接会效率更高一些。

    4.为了避免死锁,请不要滥用或者使用不必要的synchronized关键字,应该在必要的时候才使用它。

    5.在写代码的时候,请考虑性能的问题。但是并不是说要花很多时间在优化代码上,而是我们时刻应该提醒自己要注意代码的效率。

     6.内存中的静态集合类要清楚的知道何时清理,否则可能出现内存泄露的情况。

     7.避免使用while循环时出现死循环或者长时间无法跳出的情况。

     8.对Collection,Map接口的类对象初始化时最好要先分配好合理的空间大小(建议), 并且根据自己的需求选择合适的对象,我们常用的集合对象包括ArrayLIist ,HashMap,TreeMap,当然还包括Concurrent类库,ConcurrentHashMap,CopyOnWriteArrayList等。

     大家调用ArrayList的构造函数时,其源码为:

    public ArrayList()

    {

        this(10);

    }

     9.不要用Timer定时执行任务,因为Timer有很多弊端,其采用单线程方式执行所有的TimeTask,如果某个TimerTask很耗时则会影响到其他TimerTask的执行。另外Timer不会捕获由TimerTask抛出的未检查的异常,故当有异常抛出时,Timer会终止,导致未执行完得TimerTask不再执行,新的TimerTask也不能被调度,最后Timer对调度的支持是基于绝对时间的。

     所以我们选择jdk1.5引入的ScheduledThreadPoolExecutor或者ScheduledExecutorService。

     10.开发人员慎用线程,除了上面的定时任务执行使用的ScheduledExecutor,因为如果线程不当的话,会造成很大的麻烦。

     11.注意优化循环体,循环是重复运行的地方,如果循环次数很大的话,循环体内不好的代码将被放大而突出。

     12尽量少用new实例,尽量在使用时再创建该对象,尽量重用对象。如ByteBuffer,每次不要都申请一个空间,而要clear后复用。

     13.尽可能的优先使用Jdk提供的API,而不是自己写,如数组复制等,因为一般API都处于了性能的考虑。

     14.针对异常处理,一定要调用e.printStackTrace()方法打印堆栈而不是调用e.getMessage()这样的方法。

     15.统一用Log4j等log工具而不是用System.out.println()等方法打印调试,非常不方便维护。

     16.一定要有缓存的概念,玩家游戏的一个操作都不能直接操作db,都是直接更新缓存中的数据,最常用的缓存就是本地内存。

     17.对于DB的处理,大家最好同一规范,都用一个专门的JdbcTemplate或者一个封装数据库操作,接口的facade。

     18.慎用反射,反射效率很低。

     19.字符串操作很复杂的话,推荐使用强大的正则表达式进行处理。

     20.设计到游戏中状态的判断,推荐使用位运算。

     21.用统一的序列化接口序列化游戏中的数据。    

     22.游戏服务器代码中除了注释通常不能出现中文。

     23.服务器通讯时能用byte的不用short,能用int的不用String,尽量减少通讯时的数据承载。

     24.尽量不要在 方法上加synchronized,这样效率会非常低。

     25.涉及到到db编码时,原则即"一个东西不能存到两个地方",保证唯一性,避免不一致。

     26.时间处理上要统一,统一用秒。

     27.数据运算过程中,要注意数据的溢出处理。

     28.对Concurrent类库有足够熟悉后才可以使用,不要认为用了就不必同步了。

     29.尽量使用局部变量,调用方法时传递的参数以及在调用中创建的临时变量都保存在栈中,速度较快。

     30.写代码过程中要结合Junit反复测试,要写测试文档,画UML图等。
二.面向对象设计原则

    1.单一职责原则:SRP-single responsibility principle

    每个类应该只有一个职责,对外提供一种功能。

    2.开闭原则:OCP-open for extendsion,close for modification

    对类的改动是通过增加代码进行的,而不是改动现有的代码。

    3.里氏替换原则:LSP-liskov substitution principle

    在任何出现父类的地方都可以用它的子类来替代;同一个继承体系中的对象应该有共同的行为特征。

    4.依赖注入原则:DIP-dependence inversion principle

    要依赖于抽象,不要依赖于具体的实现。

    5.接口分离原则:ISP-interface segregation principle

    不应该强迫客户端程序依赖他们不需要使用的方法,一个接口不需要提供太多的行为。

    6.迪米特原则:LOD-law of demeter

    降低各个对象之间的耦合,提高系统的可维护性。在模块之间,应该通过接口进行通信,而不会理会模块的内部的工作原理。

    7.优先使用组合而不是继承原则:CARP-composite/aggregate reuse principle

    复用对象的时候,优先考虑组合,而不是继承。因为在使用继承时,父类的任何改变都可能影响子类的行为。

三.附eclipse开发最常用快捷键

    Ctrl+L-查找行数

    Ctrl+T-查找当前接口的实现类    

    Ctrl+ShiftO-快速生成import/去掉未使用的import声明

    Alt+/-内容辅助

    Ctrl+O-显示大纲

    Ctrl+/-行注释,取消行注释

    Ctrl+D-删除当前行

    Ctrl+K-快速向下查找

    Ctrl+Shift+K-快速向上查找

    Ctrl+Shift+T-查找当前workspace的type

    Ctrl+Shift+R-查找resource

    Ctrl+Shift+G-查找类方法和属性的引用

    Ctrl+Shift+F-格式化代码

    Alt+左右方向键-前进和后退历史记录

    F2-重命名(Alt+Shift+R)

    F3-快速定位光标位置的类,方法或属性

    F4-显示类的继承关系

    Ctrl+Shit+/-块注释

    Ctrl+Shift+\-取消行注释

    Ctrl+1-快速修正

    Ctrl+G/Ctrl+鼠标左键-查找当前元素的声明

    Ctrl+H-综合搜索

    Ctrl+Alt+上下方向键-复制一份代码

1
4
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics