2012-07-30 34 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,当你可以访问它作为一个静态方法(体积更小巧)