转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持!

1.面向对象的3要素。

2.面向对象开发的6大原则。

1.单一职责原则

应该有且仅有一个原因引起类的变更。

2.里氏替换原则

仅仅要父类能出现的地方,其子类就应该能出现。

也就是用子类替换父类后。保证程序照样执行。

3.依赖倒置原则

面向接口编程。

4.接口隔离原则

接口细化,也就是接口中的方法要尽量少。

5.迪米特法则

也称为最少知识原则,其定义为:一个对象应当对其它对象有最少的了解。也就是一个类中不要有过多的其它类。

6.开闭原则

开闭原则的核心是:对扩展开放。对改动关闭。

3.圈复杂度(Cyclomatic Complexity,CC)

圈复杂度(下面简称CC)是一种度量方法,表明一个方法中运行路径的数量。

CC从1開始,每多一个条件语句(if。else。switch…case。while,for)CC值加1;

一个方法的CC值越大,表明该方法越复杂;

CC值指明了全然測试一个方法所须要的測试用例。

4.圈复杂度度量

CC∈[0,5]:代码质量不错;

CC∈[6,20]:可能存在须要拆分的代码,应该尽可能想办法重构。

CC∈[21, ∞ ):必须进行重构。假设你的代码CC常常达到这个水平,请又一次整理Coding的思路;

请尽可能保证CC<10。

5.圈复杂度计算

V(G) = e – n + 2;

V(G):圈复杂度

e:程序流程图中的边数。

n:程序流程图中的节点数;

6.圈复杂度计算

代码:

void test() {

     int cnt = 0;

     for(int I = 0;I < 100;i++) {
cnt++;
} if(cnt > 100) {
System.out.println();
}

}

对应流程图:

7.减少圈复杂度

方法一

提炼函数,抽取方法:

优化前:

Int  getAppKey(String user, String package) {
String userId = “”;
String packageId = “”; System.out.println(“=============”); if(null == user) {
System.out.println(“user id is null.”);
} else {
userId = “user_” + id1;
System.out.println(“userid is ” + userId );
} if(null == package) {
System.out.println(“packageId id is null.”);
} else {
packageId = “package_” + id2;
System.out.println(“packageId is ” + packageId );
} System.out.println(“=============”);
return userId .hashCode() ^ packageId .hashCode();
}

优化后:

Int  getAppKey(String user, String package) {
String userId = geId(“user_”, user);
String packageId = getId(“package_”, package);
printId(userId, packageId );
return userId .hashCode() ^ packageId .hashCode();
} String getId(String head, String key) {
String id = “”;
if(key != null) {
id= head + user;
}
return id;
} String getPrintInfo(String name, String value) {
String info = name + “is ” + value;
if(“”.equals(value)) {
info = name + “is null.”;
}
return id;
} void printId(String userId , String packageId) { System.out.println(“=============”);
System.out.println(getPrintInfo(“userId”, userId));
System.out.println(getPrintInfo(“packageId”, packageId));
System.out.println(“=============”);
}

方法二

用循环替代条件式:

优化前:

String getName(String id) {
String name = null;
if("0000".equals(id)) {
name = "小吴";
}
if("0001".equals(id)) {
name = "小王";
}
if("0002".equals(id)) {
name = "老赵";
}
if("0003".equals(id)) {
name = "小李";
}
if("0004".equals(id)) {
name = "小刘";
}
if("0005".equals(id)) {
name = "小张";
}
return name;
}

优化后:

private static String getName(String id) {
String name = null;
//当元素个数较多的时候,将数组替换成Map。数组对象可作为參数传入。 String[] idArray = new String[]{"0000", "0001", "0002", "0003", "0004", "0005"};
String[] nameArray = new String[]{"小吴", "小王", "老赵", "小李", "小刘", "小张"};
for(int i = 0;i < idArray.length;i++) {
Object peopleID = idArray[i];
if(peopleID.equals(id)) {
name = nameArray[i];
break;
}
}
return name;
}

方法三

用初始值消减条件分支:

优化前:

String getCode(String id) {
String code = ""; if(null == id) {
code = "0000";
} else {
code = "00" + id;
}
return code; }

优化后:

String getCode(String id) {

        //初始化时设为默认值
String code = "0000"; if(id != null) {
code = "00" + id;
}
return code; }

方法四

函数取代參数:

优化前:

String getValue(String param) {

        String value = null;

        if("name".equals(param)) {
value = mName;
} else if("hight".equals(param)) {
value = mHight;
} else if("X".equals(param)) {
value = mX;
} else if("Y".equals(param)) {
value = mY;
} return value;
}

优化后:

 String getName() {
return mName;
} private static String getHight() {
return mHight;
} private static String getX() {
return mX;
} private static String getY() {
return mY;
}

方法五

用參数应对变化:

优化前:

private static int getWidth(int val) {

        int width = 0;

        if(val == 10) {
width += ((val << 2) ^ 0x10) * 200;
} else if(val == 100) {
width += ((val << 2) ^ 0x1a) * 200;
} return width;
}

优化后:

private static int getWidth(int val) {

        int width = 10;

        width += getDeta(val, 0x10);
width += getDeta(val, 0x1a); return width;
} private static int getDeta(int val, int trim) {
int deta = 0;
if(val == range) {
deta = ((val << 2) ^ trim) * 200;
}
return deta;
}

ym——优化你的Java代码(新)的更多相关文章

  1. Java 性能优化手册 — 提高 Java 代码性能的各种技巧

    转载: Java 性能优化手册 - 提高 Java 代码性能的各种技巧 Java 6,7,8 中的 String.intern - 字符串池 这篇文章将要讨论 Java 6 中是如何实现 String ...

  2. Linkedin工程师是如何优化他们的Java代码的(转)

    英文原文:LinkedIn Feed: Faster with Less JVM Garbage 最近在刷各大公司的技术博客的时候,我在Linkedin的技术博客上面发现了一篇很不错博文.这篇博文介绍 ...

  3. Linkedin工程师是如何优化他们的Java代码的

    http://greenrobot.me/devpost/java-faster-less-jvm-garbage/ Linkedin工程师是如何优化他们的Java代码的 最近在刷各大公司的技术博客的 ...

  4. 优化你的java代码性能

    一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子:import java.util. ...

  5. Java性能优化之高性能JAVA代码的若干个习惯

    创建对象: 1.避免在循环体中创建对象,循环前应该创建对象,避免浪费更多内存空间和增加GC负担 这种情况在我们的实际应用中经常遇到,而且我们很容易犯类似的错误,例如下面的代码: for (int i ...

  6. [大牛翻译系列]Hadoop(15)MapReduce 性能调优:优化MapReduce的用户JAVA代码

    6.4.5 优化MapReduce用户JAVA代码 MapReduce执行代码的方式和普通JAVA应用不同.这是由于MapReduce框架为了能够高效地处理海量数据,需要成百万次调用map和reduc ...

  7. java代码实现队列的优化

    package com.voole.queun; /** * @Decription 队列 * @author TMAC-J * */ public class Queun { /** * 初始化队列 ...

  8. java代码之美(11)---java代码的优化

    java代码的优化 随着自己做开发时间的增长,越来越理解雷布斯说的: 敲代码要像写诗一样美.也能理解有一次面试官问我你对代码有洁癖吗? 一段好的代码会让人看就像诗一样,也像一个干净房间会让人看去很舒服 ...

  9. java代码(11) ---java代码的优化

    java代码的优化 参考了一些Java开发手册有关代码的规范,觉得一段好的代码可以从三个维度去分析.1)性能,2)可扩展性,3)可读性 让我们看看别人是怎么去分析,还有值得我们去学习的地方,也是我正在 ...

随机推荐

  1. sublime中项目无法添加文件夹

    问题记录 mac中,使用vue init webpack project 后,在sublime中打开,但是添加新文件夹和删除,总提示没有权限, 然后用git提交吧 也不行,每次都要sudo 出现的提示 ...

  2. 24. TABLES

    24. TABLES TABLES表提供有关数据库中表的信息. TABLES表有以下列: TABLE_CATALOG :表所属目录的名称.该值始终为def. TABLE_SCHEMA :表所属sche ...

  3. 大页(Huge Page)简单介绍

    x86(包括x86-32和x86-64)架构的CPU默认使用4KB大小的内存页面(getconf PAGESIZE),但是它们也支持较大的内存页,如x86-64系统就支持2MB大小的大页(huge p ...

  4. windows本机域名配置

    路径: C:\Windows\System32\drivers\etc打开hosts文件如下: # Copyright (c) - Microsoft Corp. # # This is a samp ...

  5. 树莓派 - 蓝牙 (1) 试试Beacon

    首先先了解一下bluez, 以及常用的tools. - hcitool.bluetoothctl等工具,可以进行BLE设备的扫描.连接.配对.广播等操作: - hcitool可以发送HCI comma ...

  6. js事件 (包含call()方法使用特点)

    1.焦点事件 获取焦点事件onfocus\失去焦点事件onblur 例: oText.onfocus=function(){} 焦点:使浏览器能够区分用户输入的对象,当一个元素有焦点的时候,那么它就可 ...

  7. 条款7:为多太基类声明virtual析构函数

    NOTE: 1.polymorphic(多态性质的)base classes 应该声明一个virtual 析构函数.如果class带有任何virtual函数,它就应该拥有一个virtual析构函数. ...

  8. JSP默认选中下拉框的某一项

    注意<c:if>标签要写在<option>标签里面 <select id="salesInventory_${s.index}" style=&quo ...

  9. ubunt设置终端快捷键设置 及 常用快捷键

    Ctrl+A:将光标移动到命令行的开始处. Ctrl+E:将光标移动到命行令的结尾处. Ctrl+U:删除行首到光标出的字符. Ctrl+Z:把当前进程送到后台处理.  &    bg 部分快 ...

  10. IBM MQ 创建以及常见问题集锦

    消息队列+发送队列+消息通道 接收通道名称与发送端的发送通道名称要一致,修改通道信息后要执行 start channle(chlname) 重启通道.常用的MQ命令 66.0.42.240 用户 mq ...