2010-05-03 77 views
0

我重新審視數據結構和算法刷新不時我的知識和我過這個問題絆倒:公共(靜態)交換()方法,對多餘的(非靜態)私房

通常情況下,幾個數據結構確實需要交換底層數組上的一些元素。所以我在ADT1中實現了swap()方法,ADT2作爲私有的非靜態方法。好處是,作爲一種私有方法,我不需要檢查參數,壞事是冗餘。但是,如果我將swap()方法作爲公共靜態方法放入輔助類中,則需要每次檢查索引的有效性,以便在進行多次交換時使swap調用非常低效。

那我該怎麼辦?忽視性能下降,或寫小而冗餘的代碼?

回答

5

更好的設計應該始終勝過小的低效率。只有解決性能問題,如果它實際上被證明是一個問題。

此外,你還在做什麼樣的檢查?是不是自然拋出ArrayIndexOutOfBoundsException和/或NullPointerException夠好?


值得什麼,雖然有public static Collections.swap(List<?>,int,int)java.util.Arrays使得其重載(用於int[], long[], byte[], etc)所有private static

我不知道如果喬希布洛赫曾經明確闡述他爲什麼這樣做,但是我們可以猜測,它有話對他的書有效的Java第二版做第25條:不想名單陣列。是的,在使用List時會出現「性能下降」,但它可以忽略不計,並且許多優點超過了它。

+0

Arrays類的私有交換方法也讓我感到驚訝。當然,對於某些家庭作業而言,效率並不重要,但如果您要設計和發佈數據結構,則可能會產生影響。 – helpermethod 2010-05-03 15:01:54

2

如果您不需要在私有方法中進行檢查,請不要使其處於靜態方式。這將導致無效呼叫的RuntimeException,但由於您的所有呼叫都應該是有效的,因此您將使用私人方法。

1

你的代碼效率低於被複制總是更好(一些不變的調用是不可觀的)。至少這是我大學所教授的。

代碼重複會產生錯誤。所以你更喜歡你的程序正常工作,而不是更快一點。

如果您想阻止約束檢查:我想到的是,您可以接受自然拋出的異常,如polygenelubricants建議的那樣,或者爲所有基於數組的數據結構創建抽象超類。該抽象類將會保護不會檢查參數的方法交換。這不是完美的,但我想一個不檢查參數的受保護方法比不做的公共方法更好。