- 博客(33)
- 资源 (3)
- 收藏
- 关注
原创 Effective Java 学习笔记第25条 --- 谨慎设计方法的原型
谨慎选择方法的名字选择易于理解的,并且与同一个包中的其他名字风格一致;选择与大众认可的名字一致;不要过于追求提供便利的方法。过多的方法会增加类的学习和使用成本,只有当一个操作被用得非常频繁的时候,才考虑为他提供一个快加的方法。 避免过长的参数列表。太长的参数不便于使用者使用,尤其是参数类型相同的时候,很容易产生参数传递错误的问题。避免此类错误的方法:可以把一个方法...
2011-04-25 10:20:59 97
原创 Effective Java 学习笔记第24条 --- 需要时使用保护性拷贝
假设类的使用者会尽一切手段来破坏这个类的约束条件,在这样的前提下,你必须保护性地设计程序。面对客户的不良行为时仍然能保持健壮性的类。对于一个非可变类,可以考虑对其构造函数的可变参数采用保护性拷贝,如public period(Date start, Date end){ this.start = new Date(start.getTime()); this.e...
2011-04-25 09:53:18 78
原创 Effective Java 学习笔记第24条 --- 需要时使用保护性拷贝
假设类的使用者会尽一切手段来破坏这个类的约束条件,在这样的前提下,你必须保护性地设计程序。面对客户的不良行为时仍然能保持健壮性的类。对于一个非可变类,可以考虑对其构造函数的可变参数采用保护性拷贝,如public period(Date start, Date end){ this.start = new Date(start.getTime()); this...
2011-04-25 09:45:53 97
原创 Effective Java 学习笔记第23条 --- 检查参数的有效性
非公有的方法我们应该用断言的方法来检查它的参数,而不是使用通常大家所熟悉的检查语句来检测。如果我们使用的开发平台是JDK1.4或者更高级的平台,我们可以使用assert结构;否则我们应该使用一种临时的断言机制。 有些参数在使用过程中是先保存起来,然后在使用的时候再进行调用,就必须做好检查工作,否则程序可能会抛出一些异常让你摸不着头脑(如常见的空指针异常),也不能马上定位问题的所在位置,...
2011-04-25 09:43:44 94
原创 Effective Java 学习笔记第19~22条 --- 关于C语言结构的替代方案
第19条 --- 用类代替结构 JAVA刚面世的时候,很多C程序员都认为用类来代替结构现在太复杂,代价太大了,但是实际上,如果一个JAVA的类退化到只包含一个数据域的话,这样的类与C语言的结构大致是等价的。比方说下面两个程序片段: class Point { private float x; private float y; } cl...
2011-04-25 09:33:23 77
原创 Effective Java 学习笔记第17条 --- 优先考虑静态成员类
嵌套类只为它的外围类提供服务。嵌套类分为四种:静态成员类、非静态成员类、匿名类和局部类(后面三种称为内部类) 如果一个嵌套类的实例可以在它外类类的实例之外独立存在,则这个嵌套类应该设置成静态成员类(即:如果你声明的成员类不要访问外围实例,那么应该把static修饰符放到成员类的声明中)。匿名类的用法:创建一个函数对象;创建过程对象;在静态工厂方法的内部使用;在复杂的类...
2011-04-25 09:30:02 111
原创 Effective Java 学习笔记第16条 --- 接口只是被用于定义类型
接口只是用来定义一个类型,不要把接口用来做其他的事情(如在接口中定义常量,这种常量接口模式是对接口的不良使用)。 如果要导出常量,可以有以下几种方式:如果这些常量与某个已有的类或者接口有着紧密的联系,则可以把常量添加到这个类或者接口中。定义一个类型安全的枚举类,把这些常量看做枚举类型的成员。使用一个可以实例化的工具类(构造函数设为privat类型)来导出这些常量。 ...
2011-04-22 08:55:46 64
原创 Effective Java 学习笔记第15条 --- 接口优于抽象类
接口和抽象类的区别:抽象类允许包含默写方法的实现,而接口是不允许的;一个类要实现抽象类,它必须成为抽象类的一个子类,而实现接口的类只要定义了所要求的方法,并遵守通用的约定,不管这个类位于类层次的哪个地方;接口可以构造出非层次结果的类型框架,比如一个接口可以继承多个其他的接口。还可以安全地增加一个类的功能。 当然,也可以把接口和抽象类的有点结合起来,对于你期望导出的每一个总要...
2011-04-22 08:54:46 81
原创 Effective Java 学习笔记第15条 --- 要么专门为继承而设计,并给出文档说明,要么禁止继承...
对并没有文档说明的类进行继承是非常危险的,它的公有方法有可能被改变。在设计一个专门用来继承的类时必须注意以下几点(不适用于final类):必须精确地描述改写每个方法带来的影响,虽然这样的描述违法了文档格言“好的API文档应该描述一个方法做了什么工作,而不是描述它如何做”,但这也是继承破坏了程序的封装性而导致的。允许继承的类的构造函数一定不能调用可被改写的方法,无论是直接进行还是间接进...
2011-04-22 08:52:54 99
原创 Effective Java 学习笔记第14条 --- 复合优先于继承
实现代码重用最重要的办法就是继承,但是继承破坏了封装,导致软件的键壮性不足。如果子类继承了父类,那么它从父类继承的方法就依赖父类的实现,一旦他改变了会导致不可预测的结果。如果子类和超类在不同的包中,并且超类并不是为了扩展而设计的,那么继承会导致脆弱性。 作者介绍了InstrumentedHashSet作为反例进行说明,原因就是没有明白父类的方法实现。作者给出的解决办法是通过化...
2011-04-22 08:50:18 79
原创 Effective Java 学习笔记第13条 --- 支持非可变性
为了使一个类成为非可变类,要遵循下面五条规则:不要提供任何会修改对像的方法;保证没有可被子类改写的方法;使所有的域都是final的;使所有的域都成为私有的;保证对于任何可变组件的互斥访问。(如果一个类指向可变对象的域,则必须确保该类的客 户无法活得指向这些对象的引用,并且永远不要用客户提供的对象引用来初始化这样的域,也不要在任何一个访问方法中返回该对象的引用);以上规则...
2011-04-22 08:48:54 60
原创 Effective Java 学习笔记第12条 --- 使类和成员的可访问能力最小化
好的模块设计应该尽最大可能封装好自己的内部信息,这样可以把模块之间的耦合程度降到最低。开发得以并行,无疑这将加快开发的速度,便于系统地维护。Java中通过访问控制符来解决这个问题。 public表示这个类在任何范围都可用。 protected表示只有子类和包内的类可以使用 private-package(default)表示在包内可用 private表示只有类内才可以用在设计的时候应该...
2011-04-22 08:43:12 90
原创 Effective Java 学习笔记第11条 --- 考虑实现Comparable接口
compareTo方法是java.lang.Comparable接口中的唯一方法,它允许进行简单的相等比较,也允许执行顺序比较,一个类实现了 comparable接口就表明他的实例具有内置的排序关系。Java平台库中所有的值类都实现了Comparable。将当前对象与指定对象进行顺序比较的时,返回负整数,0或者正整数(<、=、>),如果指定对象的类型无法进行比较,则抛出ClassCas...
2011-04-22 08:31:21 86
原创 Effective Java 学习笔记第10条 --- 谨慎地改写clone
一个对象要想被Clone,那么要实现Clone()接口,这个接口没有定义任何的方法,但是如果你不实现这个接口的话,调用clone方法的时候会出现 CloneNotSupportedException,这就是作者叫做mixin的接口类型。通常clone()方法可以这样覆盖:public Object clone() { try { return ...
2011-04-21 12:16:05 92
原创 Effective Java 学习笔记第9条 --- 总是要改写toString()方法
在Object的toString方法返回的形式是Class的类型加上@加上16进制的hashcode,非常难以理解。最好在自己的类中提供toString方法更好的表述实例的信息,不然别人怎么看得明白呢。 在实际应用中,toString方法应该返回对象中包含的所有令人感兴趣的信息。同时,最好在程序中提供一个相匹配的构造函数或者静态工厂方法,便于程序员在对象和它的字符串表示之间进行来回转换。...
2011-04-21 11:59:13 87
原创 Effective Java 学习笔记第8条 --- 改写equals方法时必须覆盖hashCode方法
这点必须切忌,不然在你和hash-based集合打交道的时候,错误就会出现了。关键问题在于一定要满足相等的对象必须要有相等的hashCode。如果你在PhoneNumber类中覆盖了equals方法,但是没有覆盖hashCode方法,那么当你做如下操作的时候就会出现问题了。 Map m = new HashMap();m.put(new PhoneNumber(408,863,...
2011-04-21 11:58:07 68
原创 Effective Java 学习笔记第7条 --- 在改写equals方法时请遵守通用约定
下列情况是不需要改写equals方法的:同一个类的不同实例本质上是唯一的,就是个实例都有自己的本体(Identify)。不关心该类是否提供了逻辑相等的功能。父类已经改写过equals方法,对于子类来说,继承过来的equals方法已经是最合适的了。一个类是私有的或者是包可见的,且确定它的equals方法不会被调用。对于需要改写equals方法的时候,应该遵守如下约定:...
2011-04-21 11:53:10 87
原创 Effective Java 学习笔记第6条 --- 避免使用终结函数
终结函数(finalizer)可以用来回收不可到达的对象,就是说对象的生命周期结束后,可以用终结函数来回收为该对象分配的资源。但是,终结函数执行线程的优先级很低,以至于我们不敢把对时间要求比较高的对象回收让终结函数来回收。JVM总是会延迟终结函数的执行。对于急需回收对象,可以使用tyr finally,在finally写回收对象的代码,这样就保证对象能及时被回收。// try-...
2011-04-20 11:53:31 88
原创 Effective Java 学习笔记第5条 --- 消除过期的对象引用
垃圾回收器不会对“过期引用”(永远不会在被解除的引用)的对象进行回收。如:数组中的元素先增加再减少这种情况,下标大于size()的那一部分就是过期引用的对象。解决方法: public Object pop(){ if(size == 0){ throw new EmptyStackException(); } Obje...
2011-04-20 11:49:38 53
原创 Effective Java 学习笔记第4条 --- 避免创建重复的对象
如果一个对象是非可变的,那么它在程序中上可以被重用的,如: //不推荐,"test"本来就是一个String实例,如果此方法在一个循环中或者被频繁的调用,将会严重影响性能 String s = new String("test"); //推荐方式 String s = "test"; 对于提供静态方法和构造函数的非可变类,推荐使用静态方法,这样可以避免重...
2011-04-20 11:39:46 73
原创 Effective Java 学习笔记第3条 --- 通过私有的构造函数强化不可实例化的能力
在面向对象程序设计中,假如存在太多只有静态属性和静态方法的类;那么,面向对象的思想可能在这会损失殆尽。但是,并不能说面向对象的程序中就不应该出现只有静态属性和静态方法的类,相反,有时候我们还必须写这样的类作为工具类。这样的类怎么实现呢?有人可能会把该类定义成抽象类(Abstract class),的确,抽象类是不可以实例化的,但是别忘了还有继承,继承了抽象类的子类在实例化时...
2011-04-20 11:35:01 75
原创 Effective Java 学习笔记第2条 --- 试用私有构造函数强化singleton属性
实现singleton的方法有两种: 方法一:公有的静态成员是一个final域,成员的声明很清楚的表达了这个类是一个singleton。view plaincopy to clipboardprint? public class Elvis { public static final Elvis INSTANCE = new Elvis(); ...
2011-04-20 11:30:18 82
原创 Effective Java 学习笔记第1条 --- 考虑用静态工厂方法代替构造函数
静态工厂方法好处:构造函数有命名的限制,而静态方法有自己的名字,更加易于理解。静态工厂方法在每次调用的时候不要求创建一个新的对象。这种做法对于一个要频繁创建相同对象的程序来说,可以极大的提高性能。它使得一个类可以保证是一个singleton;他使非可变类可以保证“不会有两个相等的实例存在”。静态工厂方法在选择返回类型时有更大的灵活性。使用静态工厂方法,可以通过调用方法时使用不同的参数...
2011-04-20 11:22:53 76
原创 迭代子模式
迭代这个名词对于熟悉Java的人来说绝对不陌生。我们常常使用JDK提供的迭代接口进行java collection的遍历 1.迭代器角色定义了遍历的接口,但是没有规定由谁来控制迭代。在Java collection的应用中,是由客户程序来控制遍历的进程,被称为外部迭代器;还有一种实现方式便是由迭代器自身来控制迭代,被称为内部迭代器。外部迭代器要比内部迭代器灵活、强大,而且内部迭...
2011-04-18 17:35:40 59
原创 junit
JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。 junit特性JUnit是...
2011-04-11 12:19:20 65
原创 白盒测试
白盒测试百科名片 白盒测试白盒测试也称结构测试或逻辑驱动测试,它是按照程序内部的结构测试程序,通过测试来检测产品内部动作是否按照设计规格说明书的规定正常进行,检验程序中的每条通路是否都能按预定要求正确工作。 这一方法是把测试对象看作一个打开的盒子,测试人员依据程序内部逻辑结构相关信息,设计或选择测试用例,对程序所有逻辑路径进行测试,...
2011-04-11 11:25:31 127
原创 测试用例(Test Case)
简介 测试用例(Test Case)是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求。 测试用例(Test Case)目前没有经典的定义。比较通常的说法是:指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,并形成文档。...
2011-04-11 11:23:23 610
原创 Java如何调用C/C++(JNI)
1. program Java source file loading Native method /** NativeDemo * Author: huang_jc 1999/05/20 * file name: NativeDemo.java */public class NativeDemo { int i; int j; public stat...
2011-04-04 09:09:29 56
原创 Deployable Application Types
You can deploy several different types of enterprise applications in JBoss AS:• The WAR application archive (e.g., myapp.war ) packages a ...
2011-03-22 11:50:46 114
原创 SVN在linux下的使用
1、 将文件checkout到本地目录svn checkout path(path是服务器上的目录) 例如:svn checkout svn://192.168.1.1/pro/domain 简写:svn co2、 往版本库中添加新的文件svn add file 例如:svn add test.php...
2011-03-22 11:24:20 152
原创 Ant常用工具
(1)建立一个项目 (2)建立属性 (3)对数据库的操作 (4)javac编译 (5)删除目录 (6)建立目录 (7)拷贝文件群 (8)jar为一个包 (9)拷贝单个文件 (10)运行 有更多更好的常用的,我没想到的,希望大家补充。 <...
2011-03-22 10:50:12 60
原创 Eclipse 快捷键
( 1 ) Ctrl+M 切换窗口的大小( 2 ) Ctrl+Q 跳到最后一次的编辑处( 3 ) F2 当鼠标放在一个标记处出现 Tooltip 时候按 F2 则把鼠标移开时 Tooltip 还会显示即 Show Tooltip Description 。 F3 跳到声明或定义的地方。 F5 单步调试进入函数内部。 F6 单...
2011-03-19 10:25:02 65
原创 里氏代换原则(Liskov Substitution Principle)
里氏代换原则(Liskov Substitution Principle)里氏代换原则是由麻省理工学院(MIT)计算机科学实验室的Liskov女士,在1987年的OOPSLA大会上发表的一篇文章《Data Abstraction and Hierarchy》里面提出来的,主要阐述了有关继承的一些原则,也就是什么时候应该使用继承,什么时候不应该使用继承,以及其中的蕴涵的原理。 2002年,软件工...
2011-03-15 08:28:18 82
csf_player
2010-02-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人