Google使用varargs
作为参数AsyncTask
的原因是什么?例如,方法execute()
,doInBackground()
和publishProgress()
全部使用[Type]...
表示法。AsyncTask可变参数参数的用途
我认为这使得它“更难”使用,所以他们必须有一些我忽略的好理由?
所以,要么我们没有参数,一个或许多参数。让我们来分析一下:
无参数(易):
Params
参数为Void
,就是这样。 (该方法不能使用它......所以这是非常安全的。)一个参数:在这里,我至少觉得有必要做的检查在
doInBackground()
方法的开始。例如,这里是一个任务接收Integer
并产生Double
类型的结果:public Double doInBackground(Integer... myParameters) { // we are only expecting one parameter if (myParameters.length != 1) throw new IllegalArgumentException("!= 1"); return 100d * myParameters[0]; }
一个以上的参数。现在,Google必须在哪里做出正确的选择?但是,正如我所看到的,无论您是对相同类型的参数列表感兴趣,还是想要不同类型的参数。谷歌只涉及其中一个案件(与不同类型的,你需要某种通用接口。在许多情况下,我最终
Object...
并没有真正类型安全的...)
所以,如果我们完全删除varargs
,会出现什么问题?以下是这些方法的子集:
class AsyncTask<Param, Progress, Result> {
abstract Result doInBackground(Param param);
void publishProgress(Progress progress) { ... }
}
这将适用于上述所有情况。举例来说,如果我们要处理一组参数,我们可以只使用一个数组类型param
:
class MyAsyncTask extends AsyncTask<String[], Integer, String> {
String doInBackground(String[] param) {
return Arrays.toString(param);
}
}
我不明白的时候它可以是任何实际用途。但我确定我错过了一些我需要了解的curia。 :)
可能重复[当你在Java中使用可变参数?](http://stackoverflow.com/questions/766559/when-do-you-use-varargs -in-java) – CommonsWare 2013-03-06 00:09:07
为什么这个问题是这个问题的重复?这是我质疑的特定界面。为什么开发人员使用可变参数这个特定的问题。我以为我明确表示,我知道它是什么,我会在适当的时候使用它。:) – dacwe 2013-03-06 00:10:36
“这是一个我正在质疑的具体界面” - 在你的论点中没有任何东西与任何特定的东西有关'AsyncTask'。您可能会抱怨使用带有“餐厅”类的可变参数。如果你的问题集中在可变参数的影响上,比如说AsyncTask处理线程之间的通信,那么它可能不是重复的。但是,恕我直言,在我引用的问题中提出的答案似乎也涵盖了这个问题。 – CommonsWare 2013-03-06 00:14:38