ورود

View Full Version : سوال: این عبارت String... در جاوا به چه معنی است؟



Ebrahim_Rayaneh
جمعه 28 آذر 1393, 16:31 عصر
سلام

در جایی به این مثال برخوردم :




private class DTI extends AsyncTask<String, Void, String>{
protected String doInBackground(String ... urls){

return NaeMethod(urls[0]);

}
}




می خواستم بدونم در کلاس فوق پارامتر String ... به چه معناست؟ :متفکر:

منظورم اون سه تا نقطه ای هست که بعد از String قرار گرفته؟!

ahmad.mo74
جمعه 28 آذر 1393, 17:10 عصر
سلام، به این نوع پارامترها Varag گفته میشه که تعداد عناصرش نامعلومه، مثلا :


public class Test {


public static void main(String[] args) {
System.out.println(join(",", 1, 2, 3, 4));
}


static String join(String delim, Object... elements) {
StringBuilder sb = new StringBuilder();
for (Object element : elements) {
sb.append(element).append(delim);
}
sb.delete(sb.lastIndexOf(delim), sb.length());
return String.valueOf(sb);
}


}

Ebrahim_Rayaneh
جمعه 28 آذر 1393, 22:50 عصر
for (Object element : elements) {
}




این عبارت فوق آیا معادل عبارت زیر در سی شارپ هست یا نه؟





foreach(object element in elements){
//some code
}

ahmad.mo74
شنبه 29 آذر 1393, 10:06 صبح
سلام، بله هست.

#root#
شنبه 13 دی 1393, 19:39 عصر
یه سوال مرتبط، چنین متدی قابل استفاده هست؟
static String join(String delim, String... elements1, String... elements2) {
// body
}

ahmad.mo74
یک شنبه 14 دی 1393, 00:38 صبح
سلام، نه نمیشه

تو signature هر متد فقط یک varargs میشه داشت اونم به عنوان آخرین پارمتر. چون که اگر بیشتر از یکی باشه اونوقت کامپایلر نمیتونه تشخیص بده کدوم مربوط به elements1 هست و کدوم مربوط به elements2 یا اینکه مثلا ...A و ...B داشته باشیم و B فرزند A باشه یا ...

اگر نوعشون فرق کنه یعنی مثلا یکی ...int باشه یکی ...String میشه تشخیص داد اما چون این حالت کلی نیست و یا حالا به دلایل محکم تری که من نمیدونم تصمیم گرفته شده که فقط یک varargs تو siagnature تابع وجود داشته باشه.

اما برای این هم راه هست.

مثلا استفاده از Arrays.asList :


public class Main {


public static void main(String[] args) {
System.out.println(join("\n", Arrays.asList("ali", "reza").toArray(), Arrays.asList("ehsan", "jafar").toArray()));
}


public static String join(String delim, Object[] passed, Object[] failed) {
StringBuilder sb = new StringBuilder();
for (Object o : passed) {
sb.append(o).append(" = passed").append(delim);
}
for (Object o : failed) {
sb.append(o).append(" = failed").append(delim);
}
sb.delete(sb.lastIndexOf(delim), sb.length());
return String.valueOf(sb);
}


}


یا حتی یکم قشنگ تر :


public class Main {


public static void main(String[] args) {
System.out.println(join("\n", toArray("ali", "reza"), toArray("ehsan", "jafar")));
}


public static String join(String delim, String[] passed, String[] failed) {
StringBuilder sb = new StringBuilder();
for (String s : passed) {
sb.append(s).append(" = passed").append(delim);
}
for (String s : failed) {
sb.append(s).append(" = failed").append(delim);
}
sb.delete(sb.lastIndexOf(delim), sb.length());
return String.valueOf(sb);
}


@SafeVarargs
public static <T> T[] toArray(T... ts) {
return ts;
}


}