文章列表
> > nil.object_id
= > 4
原因是因为nil是一个固定的object,在如下在$rubyhome\lib\1.8\i386-mswin32中的ruby.h头文件里面有如下特殊对象的构造。
/* special contants - i.e. non-zero and non-fixnum constants */
#define Qfalse ((VALUE)0)
#define Qtrue ((VALUE)2)
#define Qnil ((VALUE)4)
#define Qundef ((VALUE)6) / ...
要保证一个类不能被实例化(比如某些Utility类,主要是一些静态方法),为这个类写一个private的构造方法那是最好的了。
public class UtilityClass {
private UtilityClass() {
throw new AssertionError();
}
......
}
这样做同时保证了这个类不能被继承。因为子类必须要调用父类的构造方法的。
如果真的写了那么一个子类会怎么样呢?会在编译的时候出错的,表明父类的构造方法是private的。
Parent() has private access in Pare ...
在Java中有很多需要单例(Singleton)的场合,来保证其只被创建一次。先来看看2种在JDK1.5之前的2种实现方法,然后再看一种JDK1.5及以后才可以用的实现方法。
[list=1]
声明constructor为private,然后将该单例对象声明为public的。
// Singleton with public final field
public class Elvis {
public static final Elvis INSTANCE = new Elvis();
private Elvis() { ... }
public void ...
我们有时候会遇到一些有超多参数的构造函数。其实对于日渐复杂的类来说,这种情况并不少见。使用Builder和一些method chain的改造,可以使我们的代码看起来更加DSL化。
Car car = CarBuilder.buildCar(CarType.MINI).engine(CarEngine.CVTT).size(3.15).build();
这样的方法比起原来的
Car car = new Car(CarType.MINI,CarEngine.CVTT,3.15);
更能确切地知道每个参数是用来干什么的,程序也更加容易读懂。
在想创建一个对象的时候,尽量使用静态工厂方法(static factory method)来代替构造方法。
比如:Boolean b = Boolean.valueOf(true);
而非Boolean b = new Boolean(true);
好处之一,与构造方法不同,方法是有名字的。在弄一些类似DSL的时候,可能会比较有用。与其要记住很多构造参数的含义,不如用一个命名良好的方法来概括。
String.BlankStringWithLen(20)看上去要比new String(" ",20)要友好一些?
好处之二,就像各种工厂类一样,在返回常量的情况下,可以不用每次 ...