2015-06-12 85 views
1

所以對於麪包類,它顯然可以這樣寫:爲什麼Toast可以在沒有新關鍵字的情況下實例化?

Toast toastMessage = Toast.makeText(this, "Hello", Toast.LENGTH_SHORT) 
toastMessage.show(); 

究竟爲什麼可能toastMessage實例化和作爲一個對象而新的關鍵字?

toastMessage如何通過方法實例化?

+0

不確定...但可能以類似'SomeClass.getInstance()'的單一類的方式? 'makeText()'方法可能是創建一個新對象或者返回一個已經存在的對象。 – Codebender

回答

8

沒有什麼特別之處Toast這裏。你只是調用一個創建實例的靜態方法(或者可能重用一個現有的實例 - 這是一個實現細節)。例如,您會在整個地方看到這種模式 - Calendar.getInstance()。有時你可以調用構造函數,有時候你可以通過只有通過靜態方法創建一個實例。

除非有什麼工藝在引擎蓋下進行,否則的某個地方在實現中會有一個對構造函數的調用。這裏有一個簡單的例子:

public final class CreateViaMethod { 
    private final String name; 

    private CreateViaMethod(String name) { 
     this.name = name; 
    } 

    public static CreateViaMethod newInstance(String name) { 
     return new CreateViaMethod(name); 
    } 
} 

爲什麼有一個API設計者可能想這樣做,有多種原因。例如,可能有幾個具有相同參數類型但具有不同名稱的「創建」方法,例如,

public static Duration fromSeconds(int seconds) 
public static Duration fromMinutes(int minutes) 
public static Duration fromHours(int hours) 

...你不能有三個重載的構造函數在那裏,但你可以給方法不同的名稱。

2

這是一個初學者的問題,但相當不錯。讓我給你一個普遍的答案。

讓我們假設你有MyClass,像這樣:

public class MyClass { 

    public MyClass() {} //constructor 

    public static MyClass generateMyClass() { 
     return new MyClass(); 
    } 

} 

您可以使用MyClass.generateMyClass()它創建了一個MyClass實例,並返回它:

MyClass myClassInstance = MyClass.generateMyClass(); 

這同樣與Toast.makeText。閱讀更多here

相關問題