轉自知乎
作者:楊博
鏈接:https://www.zhihu.com/question/19773379/answer/31625054
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
上述實現為了能夠快速獲取鏈表的大小,把鏈表大小緩存在size變量中。用法如下:
JavaIntList的作者很滿意,於是開源了java-int-list庫的1.0版。文件名是java-int-list_1.0.jar。發布后,吸引了許多用戶來使用java-int-list_1.0.jar。
有一天,作者決定要節省內存,不要緩存size變量了,把代碼改成這樣:
鏈接:https://www.zhihu.com/question/19773379/answer/31625054
來源:知乎
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
Java語言欠缺屬性、事件、多重繼承功能。所以,如果要在Java程序中實現一些面向對象編程的常見需求,只能手寫大量膠水代碼。Java Bean正是編寫這套膠水代碼的慣用模式或約定。這些約定包括getXxx、setXxx、isXxx、addXxxListener、XxxEvent等。遵守上述約定的類可以用於若干工具或庫。
舉個例子,假如有人要用Java實現一個單向鏈表類,可能會這樣寫:// 編譯成 java-int-list_1.0.jar public final class JavaIntList { static class Node { public Node next; public int value; } public Node head; public int size; }
JavaIntList myList = new JavaIntList(); System.out.println(myList.size);
有一天,作者決定要節省內存,不要緩存size變量了,把代碼改成這樣:
// 編譯成 java-int-list_2.0.jar public final class JavaIntList { static final class Node { public Node next; public int value; } public Node head; public int getSize() { Node n = head; int i = 0; while (n != null) { n = n.next; i++; } return i; } }
然后發布了2.0版:java-int-list_2.0.jar。發布后,原有java-int-list_1.0.jar的用戶紛紛升級版本到2.0。這些用戶一升級,就發現自己的程序全部壞掉了,說是找不到什么size變量。於是這些用戶就把作者暴打一頓,再也不敢用java-int-list庫了。
這個故事告訴我們,如果不想被暴打致死,你就必須保持向后兼容性。太陽公司在設計Java語言時,也懂得這個道理。所以Java標准庫中,絕對不會出現public int size這樣的代碼,而一定會一開始就寫成:private int size; public int getSize() { return size; }
讓用戶一開始就使用getSize,以便有朝一日修改getSize實現時,不破壞向后兼容性。這種public int getSize() { return size; }的慣用手法,就是Java Bean。
===============================================以上轉自知乎============================================================
那么我個人理解的javaBean,這只是一種規范而不是某種類或者說某種技術,為了實現這個規范,要滿足下面四個條件。
1、所有屬性為private
2、提供默認構造方法
3、提供getter和setter
4、實現serializable接口