- 浏览: 24320 次
- 性别:
- 来自: 深圳
-
最新评论
-
zheng108:
public class Enums { private s ...
使用enum的责任链
文章列表
一般来说,我们希望每个美剧实例能够返回对自身的描述,
而不仅仅只是默认的toString()实现,这只能返回枚举实例的名字。
为此,你可以提供一个构造器,专门负责处理这个额外的信息,
然后添加一个方法,返回这个描述信息。
注意: 下面代码提供了个 private 的构造函数, 而且里面的参数是 额外信息的类型
public enum OzWitch {
WEST("MIss GUICh"),
NORTH("Glinda");
private String description;
private OzWi ...
类的简化历[从内部类到匿名内部类]
- 博客分类:
- JavaSE
Version1:
public class DirList
{
public static void main(String[] args){
File path = new File(".");
String[] list;
if(args.length == 0)
list = path.list();
else
list = path.list(new DirFileter(args[0]));
Arrays.sort(list, String.CASE_INSENSITIVE_ORDER);
...
Thinking in java P554
持有引用
如果想继续持有对某个对象的引用,希望以后能够反问到该对象,
但是也希望能够允许垃圾回收器是否它,这是就应该使用Reference
对象。这样,可以继续使用改对象,而再内存消耗完时允许是否它。
以Reference对象作为你和普通引用的媒介,另外,一定不能有
普通的引用指向那个兑现g.zheyang就能达到上述目的。
(普通的引用指没有经Reference对象包装过的引用)。
如果垃圾回收器发现某个兑现沟通过普通引用是可获得的,该
对象就不会被释放。
SoftReference, ...
{
public static void main(String[] args){
Collection<String> c = new ArrayList<String>();
Iterator<String> it = c.iterator();
c.add("An Object");
try{
String s = it.next();
}catch(ConcurrentModificationException e){
System.out.println(e);
}
...
散列HashCode
- 博客分类:
- JavaSE
散列的价值在于速度: 散列使得查询快速,由于瓶颈位于键的查找速度,
因此解决方案之一就是保持键的排序状态,然后使用Collections.binarySearch()
进行查询.
散列更进一步,它将键保存在某处,以便能够很快找到。存储一组元素最快
的数据结构是数组,所以使用它来表示键的信息(这里说的是键的信息,而不是键本身)。
但是因为数组不能够调整容量,因此就有一个问题:我们希望在Map中保存数量不确定
的值,但是如果键的数量被数组的容量限制了,该怎么办?
答案是:数组并不保存键本身,而是通过键对象生成一个数字,将其作为数组
下标。这个数字就是散列码。由定义在Obj ...
使用散列数据结构注意点
- 博客分类:
- JavaSE
Goundhog自动继承基类Object,所以这里使用Object的hashCode()方法生成散列码,
而它默认是使用对象的地址计算散列码。所以查找不到。
可能你会认为,只需编写恰当的hashCode()方法的覆盖版本即可。但是它
任然无法正常运行,除非你同时覆盖equals()方法,它也是Object的一部分。
HashMap使用equals()判断当前键是否与表中存在的键相同。
正确的equals()方法必须满足下列5个条件:
1 自反性 对任意x x.equals(x) 一定返回true
2 对称性
3 传递性
4 一致性 对任意x和y,如果对 ...
如果我们尝试着将没有恰当支持不许的操作的类型用于需要这些方法的Set,
那么久会有大麻烦了。对于没有重新定义hashCode()方法的,如果将他们放置
到任何散列实现中都会产生重复值,这样就违反了Set的基本契约。
如果我们尝试着在TreeSet中使用没有实现Comparable的类型,那么将抛出异常
这里之所以叫享元,注意static关键字。 定制了Entry 和 EntrySet
public class Countries {
public static final String[][] DATA = {
{"CHINA","BEIJING"}
};
private static class FlyweightMap extends AbstractMap<String, String>{
private static class Entry implements Map.Entry& ...
Map生成器
对Map的使用相同的方式,需要一个Pair类,为了组装Map,每次调用
Generator的next()方法都必须产生一个键值对。
public class Pair<K,V>
{
public final K key;
public final V value;
public Pair(K k, V v){
key = k;
value = v;
}
}
key和value都是pulic和final的,这是为了Pair成为只读的数据传输对象。
public cl ...
一种Generator解决方案:
所有Collection子类型都有一个接受另一个Collection对象的构造器,
用所接受的Collection对象中的元素来填充新的容器。为了更加容易
地创建测试数据,我们需要做的是构建接受Generator和quantity
数值并将他们作为构造器参数的类。
public class CollectionData<T> extends ArrayList<T>{
public CollecitonData(Generator<T> gen, int quantity) ...
不能创建泛型数组,但能通过转型来赋予
public class ArrayOfGenericType<T>{
T[] array; //OK
public ArrayOfGenericType(int size){
//! arrya = new T[size]; //Illegal
array = (T[])new Object[size]
}
//
//! public <U> U[] makeAarray(){return new U[10];}
}
初始化有效地实现了尽可能的"惰性"。从对 initable引用的创建中可以看到,
仅使用.class语法来获得对类的引用不会引发初始化。但是,为了产生Class
引用,Class.forName()立即就进行了初始化,就想在对initable3引用的创建
中看到的。
如果一个static final值是"编译期常量",就想Initable.staticFinal那样,
那么这个值不需要对Initable类进行初始化就可以被读取。但是,如果只是一个
域设置为static和final的,还不足以去确保这种行为。
如果一个stat ...
当为一个类编写toString()方法时,如果字符创比较简单,那就可以
信赖编译器,它会为你合理地构造最终的字符串结果。
但是如果要在toString()方法中使用循环,那么最好自己创建一个
StringBuilder,用它来构造最终的结果
public class InfiniteRecursion{
public String toString(){
returen "Test"+this+"\n";
}
public static void main(String[] args){
List<Infi ...
普通内部类的字段与方法, 只能放在类的外部层次上,
所以普通的内部类不能有static数据和static字段,
也不能包含嵌套类。但是嵌套类可以包含所有这些东西
使用内部类最吸引人的原因是:
每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经
继承了某个(接口的)实现,对于内部类都没有影响。
情况1:
必须在一个类中以某种方式实现2个接口,由于接口的灵活性。有2中选择
使用单一类, 或者使用内部类。 interface A{}
interface B{}
class X implements A, B{}
class ...
// 匿名内部类 & 工厂方法
interface Service{
void method1();
void method2();
}
interface ServiceFactory{
Service getService();
}
class Implementation1 implements Service{
private Implementation1(){}
public void method1(){
System.out.println("Implementation1 meth ...