dac*_*cwe 14 java android android-asynctask
Google使用varargs参数的原因是什么AsyncTask?例如,方法execute(),doInBackground()以及publishProgress()所有使用[Type]...的符号.
我认为这使得"更难"使用,所以他们必须有一些我忽略的好理由?
所以,要么我们没有参数,要么有一个或多个参数.让我们分解一下:
没有参数(简单):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];
}
Run Code Online (Sandbox Code Playgroud)多个参数.现在这里必须是Google做出正确选择的地方吗?但正如我所看到的那样,您要么对相同类型的参数列表感兴趣,要么需要不同类型的参数.谷歌只解决了其中一种情况(不同类型你需要某种通用界面.在很多情况下,我最终Object...得到的并不是真正的类型安全......)
那么,如果我们完全删除它会有什么问题varargs呢?这是方法的一个子集:
class AsyncTask<Param, Progress, Result> {
abstract Result doInBackground(Param param);
void publishProgress(Progress progress) { ... }
}
Run Code Online (Sandbox Code Playgroud)
这适用于上述所有情况.例如,如果我们想要处理一个参数数组,我们可以使用一个数组类型param:
class MyAsyncTask extends AsyncTask<String[], Integer, String> {
String doInBackground(String[] param) {
return Arrays.toString(param);
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道什么时候它可以用于任何实际用途.但我确定我错过了一些我需要了解的东西.:)
我认为你是对的,类型参数的唯一用法Params是 in Params...,这意味着它确实是Params[]这里想要的。然而现在该 API 只适用于数组类型,它错过了很多非数组类型。
可变参数的唯一优点是在调用站点,但也不是很多 -
谷歌版本:
AsyncTask<String> task = ...
task.execute("a", "b");
Run Code Online (Sandbox Code Playgroud)
您的版本:
AsyncTask<List<String>> task = ...
task.execute(Arrays.asList("a", "b"));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2820 次 |
| 最近记录: |