2012-08-30 58 views
0

假設2種不同的方法 - 一種是靜態的,一種是非靜態的 - 需要一個實例變量。Java/C的類內實例變量的使用情況#

該變量在方法中使用3-5次不同時間進行比較。

變量不會以任何方式更改。

此外,變量的類型 - String,Colection,Collection等在編碼方式上有所不同。

在私有方法(靜態和非靜態)中使用實例變量的最佳/正確方法是什麼?

  1. 通作爲方法參數
  2. 本地存儲利用該方法來獲取值 - this.getClaimPropertyVertices();
  3. 通過獲取值本地存儲 - this.claimPropertyVertices;
  4. 在方法

直接使用實例變量當創建一個局部變量來存儲值將「最終」關鍵字提供任何優勢,如果變量將不被改變。

編輯1:根據評論,我添加其他信息 該值不能在方法中本地創建。它必須來自班級或其他訪問類的方法。

基於回答的我的解決方案:
基於@EricJ的回答。和@Jodrell。我選擇了1,並將其創建爲私有靜態方法。我還發現一些細節here來支持這一點。

+3

靜態方法無法訪問實例字段,句點。 –

+0

它確實取決於使用變量的方法的上下文。將價值傳入或可以在本地創建是否有意義?不知道方法的背景,很難回答這些問題。另外...這味道像早期的微型優化... eeeeeviiiillllll。而一個靜態方法只能訪問一個靜態變量。 –

+0

@MattBall謝謝。我從來沒有這樣做過,但想要這樣做,以便我能夠了解/瞭解是否會有差異 –

回答

4

當創建一個局部變量來存儲值將「最終」關鍵字提供任何好處,如果變量不會改變

在Java中,最後提供了一個優化的機會到編譯器。它聲明變量的內容不會被改變。關鍵字只讀在C#中提供了類似的作用。

是否還有其他優化機會是有意義取決於具體問題。在很多情況下,算法的其他部分的成本將遠遠大於編譯器由於最終只讀而能夠做出的優化。

使用這些關鍵字還有另一個好處。他們創建了一個價值不會改變的契約,這有助於代碼的未來維護者理解他們不應該改變其價值(事實上,編譯器不會讓他們)。

在私有方法(靜態和非靜態)中使用實例變量的最佳/正確方法是什麼?

通行證作爲方法參數

的值已經被存儲在該實例。爲什麼要通過它?最好的情況是這不比使用實例屬性/字段更好。最糟糕的情況是JITer沒有內聯這個調用,並且會創建一個更大的堆棧幀,花費幾個CPU週期。注意:如果您正在調用靜態方法,則必須傳遞該變量,因爲靜態方法無法訪問該對象實例。

通過使用獲取值的方法在本地存儲 - this.getClaimPropertyVertices();

這就是我一般的做法。 Getters/setters可以提供一個有意義的字段封裝。在某些情況下,getter會初始化後臺字段(當使用不調用對象構造函數的序列化程序時,C#中的常見模式,不要讓我開始討論該主題...)。

通過獲取值本地存儲 - this.claimPropertyVertices;

不,見上文。

在方法

完全一樣上述直接使用實例變量。使用這個或不使用這個應該生成完全相同的代碼。

UPDATE(根據您的修改)

如果該值是外部對象實例,並且不應該有意義與實例一起存儲,在把它作爲一個值的方法調用。

+1

不變性是好的。它可以被反覆覆蓋,但你得到你應得的。 – Jodrell

+0

@Jodrell:同意...並通過擴展,函數式編程=好:) –

+0

@Jodrell:是的。像* private *這樣的訪問器也可以被覆蓋。反思絕對是邪惡的,除非你需要它,在這種情況下,這是一個天賜之物...... :-) –

2

如果您儘可能使用static關鍵字編寫函數,則有幾個顯而易見的好處。

  1. 它什麼明顯效果輸入從簽名的功能。

  2. 你知道這個函數沒有副作用(除非你通過引用傳遞)。這忽略了非功能性副作用,例如對GUI的更改。

  3. 該函數在編程上與類沒有關係,如果您在邏輯上確定其行爲與另一個實體有更好的關聯,則可以將其移動。然後調整任何名稱空間引用。

這些好處的功能易於理解和更簡單的重用。它們也將使得在多線程環境下使用該功能變得更簡單,您不必擔心會不斷傳播副作用。


我會告訴這個答案。您應該使用static關鍵字編寫潛在的可重用函數。如果實施,簡單的或明顯不可容忍的功能應該只訪問私有成員或獲取者。

相關問題