举个例子,假如有人要用Java实现一个单向链表类,可能会这样写:
public final class JavaIntList { static class Node { public Node next; public int value; } public Node head; public int size; //保存List大小 }上述实现为了能够快速获取链表的大小,把链表大小缓存在size变量中。用法如下:
JavaIntList myList = new JavaIntList(); System.out.println(myList.size);有一天,决定要节省内存,不要缓存size变量了,把代码改成这样:
public final class JavaIntList { static final class Node { public Node next; public int value; } public Node head; public int getSize() { //外部获取List的size方法,采取函数计算 Node n = head; int i = 0; while (n != null) { n = n.next; i++; } return i; } }上述不是通过每个List保存一个int size,而是每次获取的时候,再进行getSize()计算。
我们知道更新版本,必须保持向后兼容性。sun在设计Java语言时,也懂得这个道理。所以Java标准库中,绝对不会出现public int size这样的代码,而一定会一开始就写成:
private int size; public getSize(){ return size; }让用户一开始就使用getSize,以便有朝一日修改getSize实现时,不破坏向后兼容性。这种public int getSize() { return size; }的惯用手法,就是Java Bean。
通俗来说java Bean遵循这一的一套规范:
所有属性均为 private提供默认的构造方法getter,setter来获取 private 成员变量实现 serializable 接口