[英]Good reasons for static methods?
我對真正需要靜態的東西使用靜態方法。 我使用ReSharper以獲得更好的代碼質量。 有時ReSharper建議將方法設為靜態。
當我上以下課程時:
public class WhatEverClass {
private string DoSomethingFancy(string input)
{
string fancyStuff;
// Fancy Stuff here
return fancyStuff;
}
public WhatEverClass() {
string awesome=DoSomethingFancy("some fancy string");
}
}
ReSharper可能會說“可以將DoSomethingFancy設置為靜態”。
我知道可以將其設置為靜態,但是有充分的理由真正做到這一點嗎? 還是我應該忽略這些建議?
通過定義靜態方法(即計算內容的過程),您可以向API
使用者表明有關函數無狀態性 的意圖 。
當我們使用static
函數時,我們不希望它在內部static private
變量的某個位置保存計算狀態或某些內部值,因此即使在第一次調用時傳遞相同的參數,對該函數的下一次調用也可能會產生不同的結果。 。
簡而言之:每當您看到一個僅對參數執行某項操作但不保留某些狀態的函數時,將其設置為static
。
如果您的方法不需要聲明或更改實例化對象的狀態,則它應該是靜態的。
通常的想法是,如果您不創建任何實例,則可以將其聲明為靜態。 關於應在何處使用,ReSharper根據標准編程實踐為您提供建議。 但是,我采取了“標准編程實踐”。 這是一些個人編程偏好的問題。 這是有關該主題的詳細參考:
因為您將通過創建WhatEverClass
實例從類外部調用WhatEverClass()
方法。 因此,每個實例的值都將有所不同,因為變量是局部變量,並且每次創建類的實例時都會創建該變量。
但是,如果要對所有實例保持相同的值,則可以將其設置為static
這樣它將在內存中創建一次,並且所有實例都將使用它。
當心將方法靜態化的后果!
通過將您的方法設為靜態,您將很難讓消費者放棄該算法的實現並將其替換為自己的算法(顯然,如果該方法是private
,則無需擔心)。
靜態方法的使用者將您的實現移植到了他們的代碼中-他們不能使用依賴注入來解析算法的特定實例(無需做一些工作)。 這使得他們的系統更難測試,並且通常使其自身的擴展性更差。
如果方法DoSomethingFancy
在對象WhatEverClass
中不使用任何東西,則在我的書中應將其設置為靜態,因為它實際上與使用該對象的對象無關。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.