2012-07-30 33 views
5

這可能是一個noob問題,但我想知道爲什麼我們必須使用靜態方法(makeText)來創建Toast而不是構造函數。爲什麼Toast.makeText和不是新的吐司

我們爲什麼要使用這樣的:

makeText(Context context, CharSequence text, int duration) 

,而不是這樣的:

new Toast(Context context, CharSequence text, int duration) 

這是makeText方法:

public static Toast makeText(Context context, CharSequence text, int duration) { 
     Toast result = new Toast(context); 

     LayoutInflater inflate = (LayoutInflater) 
       context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null); 
     TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message); 
     tv.setText(text); 

     result.mNextView = v; 
     result.mDuration = duration; 

     return result; 
    } 

我們爲什麼不有如下:

public Toast (Context context, CharSequence text, int duration) { 
    this(context); 

    LayoutInflater inflate = (LayoutInflater) 
      context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null); 
    TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message); 
    tv.setText(text); 

    this.mNextView = v; 
    this.mDuration = duration; 
} 

我搜索了網頁和源代碼的任何原因,但我沒有找到。

如果你有一個想法,請不要猶豫。

+1

也許是因爲使用靜態方法更容易,我們不必創建Toast對象? :) – Slickelito 2012-07-30 08:59:39

回答

5

的問題基本上鑽取到要等到我使靜態方法。答案很簡單 - 當你的方法有一個非常具體的任務,並且不改變對象的狀態。

類似於實用方法的東西,比如簡單地返回a + b的add(int a,int b)。如果我需要存儲值a + b以供將來用於該對象,那麼靜態方法是嚴格禁止的(您將無法在靜態方法中存儲非靜態變量)。但是,如果我們正在處理一些與對象狀態無關的行爲,靜態就是答案。

爲什麼我們偏好靜態如果它是獨立於對象的狀態?

  1. 內存靜態方法將只有一個副本,不管實際的對象數量。

  2. 可用性 - 方法是可行的,即使你沒有單個對象

Ofcourse的缺點是,我們保持,即使我們不使用它在所有方法的副本(如果它是非靜態的,沒有創建對象,我們可以保存這個空間)。但是這比上面提到的優點重量更低。

作爲我們這裏討論的方法(makeText),不需要保留一個狀態供以後使用,最好的方法是靜態方法。

- 編輯 -

上面提到的答案是,當我們要使用靜態和當非靜態的比較通用的,讓我得到具體到吐司類。

吐司類爲我們提供了2種方式來創建一個吐司對象(參見http://developer.android.com/reference/android/widget/Toast.html

  1. makeText(上下文的背景下,CharSequence的文字,INT持續時間),它返回的值分配敬酒的對象。

  2. 正常的方式,使用新的Toast(上下文)創建一個對象,然後根據需要設置值。

如果您使用方法1,則表示Toast.makeText(context,text,duration).show();我們完成了。我一直都在使用這種方法。

方法2僅用於特定的情況下,從http://developer.android.com/guide/topics/ui/notifiers/toasts.html

不要使用公共構造的吐司,除非你要與 的setView(視圖)定義佈局。如果您沒有要使用的自定義 佈局,則必須使用makeText(Context,int,int)創建Toast。

@CFlex,如果我得到你的問題正確,我猜你只是想知道爲什麼我們有Toast.makeText(背景,文本,持續時間)返回一個對象吐司,當同樣的事情可能已被完成一個構造函數。

每當我看到像ClassName.getObject這樣的返回類對象的東西時,我會考慮單例模式。那麼在這種情況下,我們並不完全在談論單例,我想假設makeText總是返回相同的對象(以保存N個對象的創建),否則它只是Android團隊開發的一件奇特的事情。

+0

我喜歡你的答案:) – Arkde 2012-07-30 10:20:00

+0

謝謝@Arkde :) – Kamal 2012-07-30 10:24:12

+0

@Kamal好吧,我想我明白了,但他們爲什麼不做一個Toast.showText(Context,String,int)?因爲我們可以吐司t = Toast.makeText(...);以及我們可以新的吐司(上下文,文字,dur).show();我發現makeText方法沒用。爲什麼他們不只是做別人Ctor或演出的方法。我不知道我是否足夠清楚。 – AMerle 2012-07-30 12:39:32

1

據我所知:

那是因爲我們不希望保存物體敬酒,這將需要持續使用,直至由GarbageCollector清洗的內存量的實例。

而且它總是有權顯示,因此您的應用程序不需要擁有任何一組權限。

2

一條規則:問問自己「即使沒有構建對象,調用此方法是否有意義?」如果是這樣,它肯定應該是靜態的。

請記住,對象存在於內存中,它們是爲某些作業創建的。靜態方法可用於類中的所有對象,並且不需要創建一個對象來使用它們。

所以沒有理由創建一個對象舉杯能夠訪問的方法makeText,當你可以訪問它作爲一個靜態方法(體積更小巧)