Java
mutsinghua
这个作者很懒,什么都没留下…
展开
-
Effective Java 学习笔记(2)
有时,我们在写一个构造函数时,经常因为它包含众多的参数而苦恼,这时可以考虑用Builder模式来创建对象。 如,我们要设计一个营养成份的类,包含能量,蛋白质,脂肪,钙,铁,锌,维生素A, 维生素B1 ... 等,但在构造的时候,不一定每次都需要这些参数,如钙,铁,锌和维生素等是可选的,为了适应多种可能的搭配,比较原始的办法就是采用telescoping constructor模式,例子如原创 2010-01-15 14:58:00 · 408 阅读 · 0 评论 -
Effective Java 学习笔记(9)
通常,有一类问题的产生都是由于没有重载hashCode这个方法. 当你重载equals后,hashCode必须重载,否则在使用HashMap, HashSet, Hashtable的时候,会出错.对于hashCode有几个原则.1. 不管什么时候调用hashCode,如果同一个对象与hashCode相关的字段没有修改的话,这个方法的返回值必须相同. 但不必和另一个应用程序中的值相等.2原创 2010-02-15 13:38:00 · 263 阅读 · 0 评论 -
Effective Java 学习笔记 (10)
java.lang.Object 提供了一个toString()的方法,但实际上这个方法返回的往往不是我们需要的,它返回的是类名加上“@”加上十六进制的hash值。这显然不是我们想要的,所以必须重载toString函数。很简单的例子,如下System.out.println("Failed to connect: " + phoneNumber);如果不重载,则有Failed to原创 2010-02-15 13:40:00 · 295 阅读 · 0 评论 -
Effective Java 学习笔记(14)
在公共类,使用getter & setter,而不是直接访问字段。当然,如果是不可改变的字段,那么其不利因素要小一些,对于私有类或是包可访问的类,在有些条件是可允许直接访问。原创 2010-02-15 13:36:00 · 265 阅读 · 0 评论 -
Effective Java 学习笔记(13)
影响模块设计好与坏的一个重要因素就是这个模块是否隐藏它的内部数据和其他一些实现细节。信息隐藏的好处:方便独立开发,测试,优化,使用,理解和修改。能够提高系统开发速(因为各模块可以并行开发),也能易于维护和调试,也能减少系统构建的风险。要设计良好的模块,规则很简单,就一句话:使每个类或接口尽量不可访问。1.对于top-level的类和接口(与文件名相同的类或接口),只有两种访问权限:包可原创 2010-02-15 13:42:00 · 295 阅读 · 0 评论 -
Effective Java 学习笔记(17)
如果要使一个类可继承,则好的设计和文档必不可少。首先,必须在文档中说明可以重载的方法,对每一个公共的,或保护的类或构造器,文档必须说明调用的顺序及重载的顺序,按照惯例,在每个函数的后面都有一段声明,声明这个函数的实现细节,依赖等等。 要测试一个类是否能很好的被继承,唯一的最好办法就是写一个子类来测试。当然其中一些子类应该是由其他人写。 写一个能被很好继承类的一个原则是:构造原创 2010-04-01 23:34:00 · 373 阅读 · 0 评论 -
Effective Java 学习笔记(18)
<br />接口要比抽象类要好。<br />原因有三点:<br />1.已经存在的类,不管有不有父类,都可以实现新的接口,而抽象类无法作到这一点,因为JAVA中不支持多重继承.<br />2.有时候,接口不用严格按照类层次结构来实现,即接口允许我们实现非层次结构的类型框架。<br />3.接口是定义mixin(混合类型)的理想选择。<br />由于接口不允许包含方法的实现,它不能提供一个默认的行为。但我们可以为每一个接口实现一个抽象的骨架(skeletal implementation),通常这种被称作Ab原创 2010-07-15 22:32:00 · 371 阅读 · 0 评论 -
Effective Java 学习笔记(21)
<br />使用函数对象表示策略。 实际上就是以Java的方式来实现函数指针。<br /> <br />用Java的方式实现,首先可以定义一个泛型接口,<br /> <br /><br />// Strategy interface<br />public interface Comparator<T> {<br />public int compare(T t1, T t2);<br />}<br /> <br />然后用一个类来实现它。这个类最好的sington模式,因为它没有状态,没有成员变量。<br原创 2010-07-19 23:47:00 · 358 阅读 · 0 评论 -
Effective Java 学习笔记(19)
<br />常量不应该定义在接口中,或者说不应该有纯常量的接口。<br /> <br />常量一般有以下几种方法:<br />1. 如果常量与某个类或接口相关,应该把常量加到这个类或接口中。<br />2.如果常量能被看成枚举类型,就定义为枚举。<br />3.否则请用不可实例化的工具类来导出这些常量。原创 2010-07-17 22:30:00 · 327 阅读 · 0 评论 -
Effective Java 学习笔记(24)
<br />消除非受检警告<br /> <br />使用泛型编程时,会有许多编译器警告:非受检强制转化警告(unchecked cast warnings),非受检方法调用警告,非受检普通数组创建警告,以及非受检转换警告(unchecked conversion warnings)。<br /> <br />有些警告比较好消除,而有些难以削除。要尽可能的地消除每一个非受检警告。如果消除了所有警告,就可以确保代码是类型安全的,即不会在运行时出现ClassCastException异常。<br /> <br /原创 2010-07-22 23:50:00 · 447 阅读 · 0 评论 -
Effective Java 学习笔记(22)
<br /> 嵌套类有四种,静态成员类(static member class),非静态成员类(nonstatic member class),匿名类(anonymous class)和局部类(local class)。我们应该优先考虑静态成员类。<br /> <br />静态成员可以看作是普通类,只是声明在另一个类中。它可能访问外围类的所有成员。使用静态成员类的场合是它作为公有类的辅助类,仅当与它的外部类一起使用时才起作用。<br /> <br />非静态成员类虽然看起来与静态类在语法上差不多,但实际上有原创 2010-07-20 23:15:00 · 358 阅读 · 0 评论 -
Effective Java 学习笔记(23)
<br />不要在新代码中使用原生态类型,而应该使用泛型。<br />泛型的优点:<br />1. 编译时就会进行类型检查。 当向一个容器中装入对象时,编译器会检查,插入的实例是不是前面声明的类型。而不用等到运行时才会发现,而抛出ClassCastException.<br /> <br />2.从集合中取元素不用再进行手工转换,编译器会替你进行隐式的转换。<br />尽量使用Set<Object>代替Set, 因为原生态不是类型安全的。<br />在必要时可以使用Set<?><br />// Unbou原创 2010-07-21 23:42:00 · 330 阅读 · 0 评论 -
Effective Java 学习笔记(15)
一个不可改变(immutable)的类,顾名思义,就是其实例不能改变,即里面所有的信息在创建时就赋值,在其生命周期中其值不变。使用不可改变的类的优点在于,设计简单,易于实现和使用,具体来讲,它的状态机很简单,只有一个状态。它是线程安全,能够自由的被共享,能够通过静态工厂模式尽可能复用已经创建出来的对象,也不用为它写clone或是拷贝构造函数,不可改变的类也便于维护,是系统的良性基石。其唯一原创 2010-02-18 00:46:00 · 331 阅读 · 0 评论 -
Effective Java 学习笔记(14)
在公共类,使用getter & setter,而不是直接访问字段。当然,如果是不可改变的字段,那么其不利因素要小一些,对于私有类或是包可访问的类,在有些条件是可允许直接访问。原创 2010-02-15 13:43:00 · 263 阅读 · 0 评论 -
Effective Java 学习笔记(1)
通常情况下,我们在写一个类时,一般会赋予它一个或几个public的构造函数,让外部程序能够创建对象. 然而,在effective java 中,从另一个角度告诫我们在使用public的构造函数前,先考虑用public 的静态函数来创建对象. 其优点如下: 1. 一个静态的工厂函数,可以取不同的名字. 而构造函数的名字只能与类同名. 一个API的设计中,一个好懂的名字原创 2010-01-12 23:49:00 · 758 阅读 · 0 评论 -
Java 中的内部静态类
Java 中内部动态类(没有static)关键字和内部静态类的就在于内部动态类不能定义静态变量或是静态方法,如果要在内部类中使用静态成员,必须将类声明为静态类. 内部类中的静态方法可以访问外部类的静态方法和本类中的静态方法或成员, 非静态方法可以访问其他所有的方法或成员原创 2010-01-13 23:59:00 · 483 阅读 · 0 评论 -
Effective Java 学习笔记(4)
这个原则很简单,就是使用私有构造函数防止类被实例化。 有时,我们会写一些工具类,如java.lang.Math 或是 java.util.Arrays, 这些类中都是静态函数,在设计的时候,这些类并不是用来被实例化的。这个时候,就很有必要把构造函数私有化。 public class UtilityClass { private UtilityClass() { throw n原创 2010-01-18 10:25:00 · 271 阅读 · 0 评论 -
Effective Java 学习笔记(8)
当重载equals方法时,遵循惯例. equals不是每个类都必须重载,当以下几个条件满足,可以不重载equals. 1. 类的实例只有同一个才被判为相等. 如Thread类. 2. 不用关心两个对象是否逻辑相等的时候,或是说比较对象没有意义. 3.父类已经重载了equals,而且父类的equals也适用于子类,子类就不用重载equals. 4.这是一个私有类或是包内访问,你确定equa原创 2010-01-23 15:56:00 · 468 阅读 · 0 评论 -
Effective Java 学习笔记(5)
尽量复用对象,而不是创建新的对象,特别是当一个对象是immutable(不可改变)的时候。 如String对象, String s= new String(“String”); 千万不要这样做,因为这里实际上创建了两个对象。 要避免出现这样的情况, 1是可以用静态工厂函数,来解决,如类库中的Boolean.valueOf(“true”),这种方式要优于new Boolean(“true原创 2010-01-21 12:24:00 · 349 阅读 · 0 评论 -
Effective Java 学习笔记 (6)
及时消除不使用的对象的引用, 理论上, 带有内存管理的语言是不存在内存泄漏的, 但是如果对对象的操作不当,也是可能会造成内存泄漏. 如有一个stack, 其pop函数如下. public Object pop() { if( Element.length() == 0) return null; return Element[s原创 2010-01-23 00:24:00 · 437 阅读 · 0 评论 -
Effective Java 学习笔记 (7)
Finalizer 不可计划的,也是危险的,一般也是不必要的. 不能在finalizer中放任何与依赖时间相关的操作,因为你不知道它什么时候被执行. 比如在finalizer中关闭文件的做法就是错误的, 根据JVM的实现方式不同,有可能导致打开的文件数过多而无法再打开文件. 也不能在finalizer中改变状态,如给数据库解锁等. finalizer还能带来严重的性能问题, 显示的调用的终原创 2010-01-23 14:56:00 · 752 阅读 · 1 评论 -
Effective Java 学习笔记(9)
通常,有一类问题的产生都是由于没有重载hashCode这个方法. 当你重载equals后,hashCode必须重载,否则在使用HashMap, HashSet, Hashtable的时候,会出错.对于hashCode有几个原则.1. 不管什么时候调用hashCode,如果同一个对象与hashCode相关的字段没有修改的话,这个方法的返回值必须相同. 但不必和另一个应用程序中的值相等.2原创 2010-01-24 17:44:00 · 394 阅读 · 0 评论 -
Effective Java 学习笔记 (10)
java.lang.Object 提供了一个toString()的方法,但实际上这个方法返回的往往不是我们需要的,它返回的是类名加上“@”加上十六进制的hash值。这显然不是我们想要的,所以必须重载toString函数。 很简单的例子,如下 System.out.println("Failed to connect: " + phoneNumber); 如果不重载,则有 Failed to原创 2010-01-28 17:42:00 · 361 阅读 · 0 评论 -
Effective Java 学习笔记 (11)
Clone这个方法很鸡肋,原因是因为它是受保护的(protected),其二Clone这个方法是可选的,即有可能类没有提供这个方法。clone没有调用构造函数,而且如果父类没有实现clone的话,子类永远也不可能正确实现clone.总之,clone是个很头痛的函数,如果要正确实现,必须考虑到深考贝的情况,否则被克隆出来的对象就不是独立的,如,要写一个堆栈类的克隆函数,正确的实现方法是:原创 2010-01-29 17:01:00 · 480 阅读 · 0 评论 -
Effective Java 学习笔记 (12)
与其它类不同,compareTo方法并不是Ojbect中的方法,它是Comparable接口中唯一的方法。通过实现Comparable接口,可以它能够自然排序。 排序,Arrays.sort(a); 就OK了。 书上提了一个巧妙的方法,用来消除重复的字符串。它用了一个Set集合来过滤重复的字段。 public class WordList { public static原创 2010-01-29 20:56:00 · 485 阅读 · 0 评论 -
Effective Java 学习笔记(25)
<br />优先使用列表,而不是数组。<br /> <br />数组与泛型相比,有两个重要的不同点。1.数组的类型可以向上转型,即如果sub为super的子类型,那么数组类型的sub[]就是super[]的子类型,相反,泛型则是不可变的。<br />2.数组是会在运行时才知道并检查它们的元素类型约束,会抛运行时异常,而泛型只在编译时强化类型信息,并在运行时丢弃。从技术上说,泛型是不可具体化的,即运行时包含的信息比它编译时更少。<br /> <br />一般说来,数组和泛型不能很好地混合使用。如果得到编译时错原创 2010-07-26 00:08:00 · 424 阅读 · 0 评论