2013-05-03 213 views
0
public class A 
{ 
    public void doSomething() 
    { /*code*/} 
} 

doSomething方法不以任何方式,從而由邏輯它可能是static引用對象A的狀態。靜態VS新對象

是什麼選項1和2之間的差:

  1. new A().doSomething()
  2. 假設doSomething是靜態的; A.doSomething()

我想說的是,選項2更好,因爲每當它使用時第一個將創建一個新的對象。

+5

'new A()'創建一個新對象;調用靜態方法不需要調用實例。通常,對象創建*非常便宜,我推薦*接口*和*避免靜態方法*。在使用DI和/或IoC之前,爲什麼不一定會變得明顯,並且在哪個時間您可能只是感謝這些建議。 – user2246674 2013-05-03 18:43:19

+1

也許它不應該在'A'類。 – 2013-05-03 18:43:26

+0

A.doSomething()將無法訪問A的實例變量,它們需要作爲參數傳入 – 2013-05-03 18:46:21

回答

1

選項1,以調用哪個根據你的問題聽起來好像它並不需要(沒有什麼doSomething()需要的A一個實例)的方法doSomething()創建的A一個新的實例。選項2跳過不需要的實例創建,同時產生相同的效果,所以它會更好(假設這是唯一的設計要求)。現在可能有其他原因不使用靜態,例如,如果在界面中實現了A,或者如果在將來可能需要在其之外建立信息的某個點處可以改變doSomething的性質。

-1

你必須聲明爲靜態的方法:

public class A { 
    public static void doSomething() { 
     // code 
    } 
} 

這允許你做A.doSomething()並防止doSomething()從看任何實例方法或字段(因爲你怎麼會知道這A實例使用?),如果它沒有引用它們,這應該不成問題。

有關詳細信息,請參閱The Java Tutorial's Article on Instance and Class Methods

+0

我很欣賞這個回答,但這不是問題的問題。我知道如何聲明一個靜態方法,以及如何在代碼中引用它與創建對象,我的問題更多的是兩個 – Sababado 2013-05-03 19:02:56

+1

@Sababado之間的幕後差異哦。在這種情況下,我建議使用靜態方法,因爲如果它剛剛立即得到GCed,沒有理由創建對象。查看其他答案的更多詳情 – 2013-05-03 19:09:08

+0

謝謝,非常感謝 – Sababado 2013-05-03 19:16:44

0

還有第三個選項。

創建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的狀態,則可以。

+0

我希望這是一個選項。我排除這一點的原因是因爲有幾個不同的文件/類引用了相同的方法。 – Sababado 2013-05-03 19:05:00

1

您正在進入編程的「表達式」部分。你想表達什麼?

三種情況討論:

  1. 你的方法是一個行動的任何一個可以採取,或消息的任何給定的一個可以迴應,
  2. 你的方法是一個動作A類的應該回應到,並且
  3. A是一個單身人士,您的方法接收該單身人士的消息。

現在問自己:你打算表達什麼?對於A類,「doSomething」是否合適?或者說,它只是A的每個實例都應該能夠做到的事情,而不管它的內部是什麼? 「A」是否表示在您的程序世界中應該只有1個實例?

作爲一個實踐點,你不能重載靜態方法,所以除了「表達意圖」之外,你需要意識到這一點。

很多基本工具都屬於「靜態」類別,創建A的新實例時會有(小)時間損失,但總體而言 - 您最有可能做到最好,更重要的是如果你能夠正確地回答上述問題,那麼該方法的後期生活將對其他代碼的影響最小,從而選擇最符合該對象意圖的實現。