Каковы причины, по которым 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]; }
-
Более одного параметра. Теперь должно быть, где Google сделал правильный выбор? Но, как я вижу, вас либо интересует список параметров того же типа, либо вам нужны разные типы параметров. 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);
}
}
Я не вижу, когда это может быть практическим. Но я уверен, что мне не хватает чего-то курии, о которой я должен знать.:)