程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> Effective java學習筆記8

Effective java學習筆記8

編輯:JAVA編程入門知識

  啥?我只是改寫equal()不行麼?我看到這裡也是這麼想得。
  這個是由於要遵從Java.lang.object的規范第二條:
  兩個根據equal()相等的對象他們返回的hashcode值也必然相等。
  假如你改寫了equal()方法,令兩個實際不是一個對象的兩個實例在邏輯上相等了,但是hashcode卻是不等。
  所以要記得改寫hashcode。
  不改寫會帶來什麼後果呢?當然,比如你在用hashmap,hashtable之類的設計hashcode的類的時候,就會出麻煩了。
  至於如何改寫一個hashcode,這就有好有壞了,看各人的功底了。現在還有專門的科學家在研究優秀的hash算法。
  
  總是要改寫tostring()
  這個並沒有嚴格的規定,不想hashcode那樣會帶來災難性的陷阱。
   但是,java也是有提到”建議改寫tostring()”
   因為這樣可以給我們更好的一個習慣,以及更好的一個風格。
   很簡單,假如一個object我們並沒有改寫它的tostring,那麼調用這個object的tostring()方法,將得到一串難以理解的string。
   假如你改寫了tostring(),則可以得到更加具體與清楚的信息。
  
  改寫clone的時候要小心
  看了這章,覺得這幾句話重要:
   一個專家級程序員,從來都不會去改寫clone方法,也從來不去調用它,除非是為了低開銷來拷貝一個數組。
   一個為了繼續而設計的類,假如未能實現一個行為良好的protected的clone方法,它的子類要實現cloneable接口是不可能的。
   真的要做,如何實現改寫clone方法呢?
   所有實現了cloneable接口的類都應該用一個公有的方法改寫clone,這個方法要首先調用super.clone,假如所有的類都實現這麼做,那麼最終就會回溯到object的clone方法,不會得到clone得到不對的對象的情況。調用super.clone之後,把所有復雜對象設成初始狀態,原始類型數據可以直接復制。
   通常情況下,此時還需要對內部的任何可變對象(比如堆棧,鏈表)進行深層結構的拷貝。不能簡單的復制。
   比如,A實例有一個堆棧Stack,調用A的clone方法,假如僅僅是令B的Stack=A的stack,那麼修改A的stack同時會影響到B中stack的情況。所以,我們必須進行深層拷貝,防止這個問題。
  
   考慮實現comparable接口 CompareTo方法在object裡並沒有實現,compareto是comparable接口的唯一方法。
   我們在寫某些值類的時候,最好能夠實現comparable接口,這樣,會給我們自己帶來很大的方便。
   比如,假如一個數組實現了這個接口,那麼對它的排序將會非常簡單:
  ????array.sort(a);
   所以,這個也應該是我們應該考慮的一點。
   當然,我們實現的時候也要遵循相關的comparable規范。
   規范在這就不寫了。
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved