public class A
{
public void doSomething()
{ /*code*/}
}
的doSomething
方法不以任何方式,從而由邏輯它可能是static
引用對象A
的狀態。靜態VS新對象
是什麼選項1和2之間的差:
new A().doSomething()
- 假設
doSomething
是靜態的;A.doSomething()
我想說的是,選項2更好,因爲每當它使用時第一個將創建一個新的對象。
public class A
{
public void doSomething()
{ /*code*/}
}
的doSomething
方法不以任何方式,從而由邏輯它可能是static
引用對象A
的狀態。靜態VS新對象
是什麼選項1和2之間的差:
new A().doSomething()
doSomething
是靜態的; A.doSomething()
我想說的是,選項2更好,因爲每當它使用時第一個將創建一個新的對象。
選項1,以調用哪個根據你的問題聽起來好像它並不需要(沒有什麼doSomething()
需要的A
一個實例)的方法doSomething()
創建的A
一個新的實例。選項2跳過不需要的實例創建,同時產生相同的效果,所以它會更好(假設這是唯一的設計要求)。現在可能有其他原因不使用靜態,例如,如果在界面中實現了A
,或者如果在將來可能需要在其之外建立信息的某個點處可以改變doSomething
的性質。
你必須聲明爲靜態的方法:
public class A {
public static void doSomething() {
// code
}
}
這允許你做A.doSomething()
並防止doSomething()
從看任何實例方法或字段(因爲你怎麼會知道這A
實例使用?),如果它沒有引用它們,這應該不成問題。
有關詳細信息,請參閱The Java Tutorial's Article on Instance and Class Methods。
還有第三個選項。
創建A的一個實例,然後將其用於每次調用。
例如,在類或應用程序正在使用A,
A myA = new A(); // you can consider making this static if that makes sense...
... 然後,如稍後關於 需要...
myA.soSomething();
的優點是,在未來,如果您確實需要改變doSomething的行爲,您可以將第一行改爲
A myA = new SubclassOfAThatDoesSomethingDifferent();
或者,如果doSomething()
最終確實需要引用A的狀態,則可以。
我希望這是一個選項。我排除這一點的原因是因爲有幾個不同的文件/類引用了相同的方法。 – Sababado 2013-05-03 19:05:00
您正在進入編程的「表達式」部分。你想表達什麼?
三種情況討論:
現在問自己:你打算表達什麼?對於A類,「doSomething」是否合適?或者說,它只是A的每個實例都應該能夠做到的事情,而不管它的內部是什麼? 「A」是否表示在您的程序世界中應該只有1個實例?
作爲一個實踐點,你不能重載靜態方法,所以除了「表達意圖」之外,你需要意識到這一點。
很多基本工具都屬於「靜態」類別,創建A的新實例時會有(小)時間損失,但總體而言 - 您最有可能做到最好,更重要的是如果你能夠正確地回答上述問題,那麼該方法的後期生活將對其他代碼的影響最小,從而選擇最符合該對象意圖的實現。
'new A()'創建一個新對象;調用靜態方法不需要調用實例。通常,對象創建*非常便宜,我推薦*接口*和*避免靜態方法*。在使用DI和/或IoC之前,爲什麼不一定會變得明顯,並且在哪個時間您可能只是感謝這些建議。 – user2246674 2013-05-03 18:43:19
也許它不應該在'A'類。 – 2013-05-03 18:43:26
A.doSomething()將無法訪問A的實例變量,它們需要作爲參數傳入 – 2013-05-03 18:46:21