উত্তর:
এর অর্থ শূন্য বা আরও বেশি স্ট্রিং অবজেক্ট (বা তাদের একটি অ্যারে) সেই পদ্ধতির জন্য আর্গুমেন্ট হিসাবে পাস হতে পারে।
এখানে "আর্গুমেন্টের সালিসী সংখ্যা" বিভাগটি দেখুন: http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html#varargs
আপনার উদাহরণে, আপনি এটি নীচের যে কোনও হিসাবে কল করতে পারেন:
myMethod(); // Likely useless, but possible
myMethod("one", "two", "three");
myMethod("solo");
myMethod(new String[]{"a", "b", "c"});
গুরুত্বপূর্ণ দ্রষ্টব্য: এইভাবে দেওয়া আর্গুমেন্টগুলি সর্বদা একটি অ্যারে থাকে - এমনকি যদি কেবল একটি থাকে। নিশ্চিত হয়ে নিন যে আপনি পদ্ধতির শরীরে সেভাবে আচরণ করে।
গুরুত্বপূর্ণ দ্রষ্টব্য 2: যে আর্গুমেন্টটি পায় তা ...
অবশ্যই পদ্ধতির স্বাক্ষরে সর্বশেষ। সুতরাং, myMethod(int i, String... strings)
ঠিক আছে, তবে myMethod(String... strings, int i)
ঠিক নেই।
তার মন্তব্যে স্পষ্টতার জন্য ভাসকে ধন্যবাদ।
someMethod(new SomeType[] { })
। এটি হ্যাক হবে, তাই না?
এই বৈশিষ্ট্যটিকে ভারাজস বলা হয় , এবং এটি জাভা ৫ এ প্রবর্তিত একটি বৈশিষ্ট্য যার অর্থ এই ফাংশনটি একাধিক String
যুক্তি গ্রহণ করতে পারে :
myMethod("foo", "bar");
myMethod("foo", "bar", "baz");
myMethod(new String[]{"foo", "var", "baz"}); // you can even pass an array
তারপরে, আপনি String
অ্যারে হিসাবে বিভিন্নটি ব্যবহার করতে পারেন :
public void myMethod(String... strings){
for(String whatever : strings){
// do what ever you want
}
// the code above is is equivalent to
for( int i = 0; i < strings.length; i++){
// classical for. In this case you use strings[i]
}
}
এই উত্তরটি কিসওয়াসা এবং লোরেঞ্জোর ... এবং গ্রাফাইনের মন্তব্য থেকে প্রচুর .ণ নিয়েছে।
এটি ভার্সেস :)
ভেরিয়েবল-দৈর্ঘ্যের আর্গুমেন্টগুলির জন্য সংক্ষিপ্তভাবে ভ্যারাগারস এমন একটি বৈশিষ্ট্য যা পদ্ধতিটিকে আর্গুমেন্টের ভেরিয়েবল সংখ্যা (শূন্য বা আরও বেশি) মেনে নিতে দেয়। ভারার্গসের সাহায্যে এমন পদ্ধতিগুলি তৈরি করা সহজ হয়ে উঠেছে যাতে চলক সংখ্যক আর্গুমেন্ট নেওয়া দরকার। ভেরিয়েবল আর্গুমেন্টের বৈশিষ্ট্যটি জাভা 5-এ যুক্ত করা হয়েছে।
ভারার্গসের সিনট্যাক্স
একটি ভারার্গ তথ্য প্রকারের পরে তিনটি উপবৃত্ত (তিনটি বিন্দু) দ্বারা সুরক্ষিত হয়, এর সাধারণ ফর্ম
return_type method_name(data_type ... variableName){
}
Varargs জন্য প্রয়োজন
জাভা 5 এর পূর্বে, যদি চলক সংখ্যক তর্ক যুক্তির প্রয়োজন হয়, তবে এটি পরিচালনা করার দুটি উপায় ছিল
যদি আর্গুমেন্টের সর্বাধিক সংখ্যা থাকে তবে একটি পদ্ধতিটি ছোট এবং জ্ঞাত হতে পারে তবে পদ্ধতির ওভারলোড হওয়া সংস্করণ তৈরি করা যেতে পারে। কোনও পদ্ধতি গ্রহণ করতে পারে এমন আর্গুমেন্টের সর্বাধিক সংখ্যা যদি বড় বা / এবং অজানা ছিল তবে পদ্ধতির ছিল সেই আর্গুমেন্টগুলিকে একটি অ্যারেতে রেখে সেগুলি এমন একটি প্যাসেমে পাঠানো যা প্যারামিটার হিসাবে অ্যারে নেয়। এই 2 টি পদ্ধতির ত্রুটি-প্রবণ ছিল - প্রতিটি সময় প্যারামিটারের অ্যারে তৈরি করা এবং বজায় রাখা শক্ত - কারণ নতুন যুক্তি যুক্ত হওয়ার ফলে একটি নতুন ওভারলোডেড পদ্ধতি লেখার ফলস্বরূপ।
Varargs এর সুবিধা
একটি আরও সহজ বিকল্প প্রস্তাব। ওভারলোডেড পদ্ধতিগুলি লেখার প্রয়োজন নেই বলে কম কোড।
Varargs উদাহরণ
public class VarargsExample {
public void displayData(String ... values){
System.out.println("Number of arguments passed " + values.length);
for(String s : values){
System.out.println(s + " ");
}
}
public static void main(String[] args) {
VarargsExample vObj = new VarargsExample();
// four args
vObj.displayData("var", "args", "are", "passed");
//three args
vObj.displayData("Three", "args", "passed");
// no-arg
vObj.displayData();
}
}
Output
Number of arguments passed 4
var
args
are
passed
Number of arguments passed 3
Three
args
passed
Number of arguments passed 0
প্রোগ্রামটি থেকে দেখা যাবে যে পদ্ধতিতে পাস হওয়া আর্গুমেন্টগুলির সংখ্যা জানতে এখানে দৈর্ঘ্যটি ব্যবহৃত হয়। এটি সম্ভব কারণ ভারার্গগুলি সুস্পষ্টভাবে একটি অ্যারে হিসাবে পাস করা হয়েছে। ভারার্গস হিসাবে যে কোনও আর্গুমেন্ট পাস করা হয় তা অ্যারেতে সংরক্ষণ করা হয় যা ভারার্গ্সকে দেওয়া নাম দ্বারা উল্লেখ করা হয়। এই প্রোগ্রামে অ্যারের নাম মান হয়। এছাড়াও নোট করুন যে পদ্ধতিটি বিভিন্ন সংখ্যক আর্গুমেন্টের সাথে ডাকা হয়, প্রথমে চারটি আর্গুমেন্টের সাথে কল করুন, তারপরে তিনটি আর্গুমেন্ট এবং তারপরে শূন্য আর্গুমেন্ট সহ। এই সমস্ত কলগুলি একই পদ্ধতি দ্বারা পরিচালিত হয় যা ভারার্গস নেয়।
Varargs সঙ্গে সীমাবদ্ধতা
কোনও পদ্ধতিতে ভারার্গস প্যারামিটার সহ অন্যান্য প্যারামিটার থাকা সম্ভব, তবে সেই ক্ষেত্রে, ভ্যারাগস প্যারামিটারটি অবশ্যই পদ্ধতি দ্বারা ঘোষিত শেষ প্যারামিটার হতে হবে।
void displayValues(int a, int b, int … values) // OK
void displayValues(int a, int b, int … values, int c) // compiler error
ভারার্গসের সাথে আর একটি বিধিনিষেধ হ'ল এখানে কেবল একটি ভারার্গ্স প্যারামিটার থাকতে হবে।
void displayValues(int a, int b, int … values, int … moreValues) // Compiler error
ওভারলোডিং ভ্যারাগস পদ্ধতিগুলি
ভারার্গ্স প্যারামিটার গ্রহণকারী কোনও পদ্ধতি ওভারলোড করা সম্ভব। ভারার্গস পদ্ধতিটি এর মাধ্যমে ওভারলোড হতে পারে -
এর ভারারগ প্যারামিটারের প্রকারটি আলাদা হতে পারে। অন্যান্য পরামিতি যুক্ত করে। ওভারলোডিং ভারার্গ্স পদ্ধতির উদাহরণ
public class OverloadingVarargsExp {
// Method which has string vararg parameter
public void displayData(String ... values){
System.out.println("Number of arguments passed " + values.length);
for(String s : values){
System.out.println(s + " ");
}
}
// Method which has int vararg parameter
public void displayData(int ... values){
System.out.println("Number of arguments passed " + values.length);
for(int i : values){
System.out.println(i + " ");
}
}
// Method with int vararg and one more string parameter
public void displayData(String a, int ... values){
System.out.println(" a " + a);
System.out.println("Number of arguments passed " + values.length);
for(int i : values){
System.out.println(i + " ");
}
}
public static void main(String[] args) {
OverloadingVarargsExp vObj = new OverloadingVarargsExp();
// four string args
vObj.displayData("var", "args", "are", "passed");
// two int args
vObj.displayData(10, 20);
// One String param and two int args
vObj.displayData("Test", 20, 30);
}
}
Output
Number of arguments passed 4
var
args
are
passed
Number of arguments passed 2
10
20
a Test
Number of arguments passed 2
20
30
ভারার্গস এবং ওভারলোডিং অস্পষ্টতা
আমাদের বেশিরভাগ ভারে ভার্সড পদ্ধতি থাকা অবস্থায় কিছু ক্ষেত্রে কল অস্পষ্ট হতে পারে। আসুন একটি উদাহরণ দেখুন
public class OverloadingVarargsExp {
// Method which has string vararg parameter
public void displayData(String ... values){
System.out.println("Number of arguments passed " + values.length);
for(String s : values){
System.out.println(s + " ");
}
}
// Method which has int vararg parameter
public void displayData(int ... values){
System.out.println("Number of arguments passed " + values.length);
for(int i : values){
System.out.println(i + " ");
}
}
public static void main(String[] args) {
OverloadingVarargsExp vObj = new OverloadingVarargsExp();
// four string args
vObj.displayData("var", "args", "are", "passed");
// two int args
vObj.displayData(10, 20);
// This call is ambiguous
vObj.displayData();
}
}
এই প্রোগ্রামে যখন আমরা কোনও পরামিতি ছাড়াই প্রদর্শনের ডেটা () পদ্ধতিতে কল করি তখন এটি ত্রুটি ছুঁড়ে দেয়, কারণ এই পদ্ধতিটি কল করার জন্য কম্পাইলার নিশ্চিত না displayData(String ... values)
বা নাdisplayData(int ... values)
একইভাবে যদি আমাদের ওভারলোডেড পদ্ধতি থাকে যেখানে একটিতে vararg
এক ধরণের পদ্ধতি থাকে এবং অন্য পদ্ধতিতে vararg
একই ধরণের একটি প্যারামিটার এবং প্যারামিটার থাকে, তবে আমাদের অস্পষ্টতা যেমন - এক্সপ -
displayData(int ... values)
এবংdisplayData(int a, int ... values)
এই দুটি ওভারলোডেড পদ্ধতিতে সর্বদা অস্পষ্টতা থাকবে।
এটি ভেরাগস (ভেরিয়েবল সংখ্যা আর্গুমেন্ট) পাস করার জাভা উপায় ।
আপনি যদি সি এর সাথে পরিচিত হন তবে ...
এটি এটির সিনট্যাক্সের মতো যা এটি ব্যবহার করে printf
:
int printf(const char * format, ...);
তবে একটি প্রকার নিরাপদ ফ্যাশনে: প্রতিটি যুক্তি নির্দিষ্ট ধরণের সাথে মেনে চলতে হয় (আপনার নমুনায়, সেগুলি সবই হওয়া উচিত String
)।
আপনি কীভাবে ভারারা ব্যবহার করতে পারবেন এটির একটি সহজ নমুনা :
class VarargSample {
public static void PrintMultipleStrings(String... strings) {
for( String s : strings ) {
System.out.println(s);
}
}
public static void main(String[] args) {
PrintMultipleStrings("Hello", "world");
}
}
...
যুক্তি আসলে একটি অ্যারের, তাই আপনি একটি পাস পারে String[]
প্যারামিটার হিসাবে।
params
আপনি যদি সেই ব্যাকগ্রাউন্ড থেকে আসেন তবে কেবল এটি সি # তে কীওয়ার্ড হিসাবে মনে করুন :)
অ্যান্ড্রয়েড অ্যাসিঙ্কটাস্কের একটি বিখ্যাত পদ্ধতির মধ্যে এটি উপস্থিত রয়েছে যে তিনটি বিন্দুর ব্যবহারের একটি স্পষ্ট উদাহরণ দেখার সত্যিই একটি সাধারণ উপায় (এটি আজ আরএক্সজেএভিএর কারণে খুব বেশি ব্যবহৃত হয় না, গুগল আর্কিটেকচার উপাদানগুলির উল্লেখ না করে), আপনি এই শব্দটির সন্ধান করে এমন হাজার হাজার উদাহরণ খুঁজে পেতে পারেন এবং এটি বোঝার সর্বোত্তম উপায় এবং তিনটি বিন্দুর অর্থ আর কখনও ভুলে যাবেন না তারা সাধারণ ভাষায় যেমন একটি ... সন্দেহ ... প্রকাশ করেন। যথা, এটি যে পরামিতিগুলি পাস করতে হয়েছে, 0 হতে পারে, 1 হতে পারে আরও 1 (অ্যারে) হতে পারে তা পরিষ্কার নয় ...
String...
হিসাবে একই String[]
import java.lang.*;
public class MyClassTest {
//public static void main(String... args) {
public static void main(String[] args) {
for(String str: args) {
System.out.println(str);
}
}
}
String...
একই হয় তবে String[]
আপনি কি কেবল এটি বলতে পারছেন না?
String[]
আর্গুমেন্টের প্রয়োজন (কমপক্ষে একটি খালি অ্যারে) যেখানে String...
নেই (উপরের উত্তরটি দেখুন)।
অন্যান্য ভাল-লিখিত উত্তরের সাথে যুক্ত করার সাথে সাথে varagrs
আমার একটি সুবিধাটি দরকারী বলে মনে হয়েছিল তা হল, আমি যখন অ্যারে যুক্ত কোনও প্যারামিটারের ধরণ হিসাবে কল করি তখন এটি অ্যারে তৈরির ব্যথা দূর করে; উপাদান যুক্ত করুন এবং তারপরে এটি প্রেরণ করুন। পরিবর্তে, আমি যতটা মান চাই পদ্ধতিতে কেবল কল করতে পারি; শূন্য থেকে অনেকের কাছে।
উদাহরণ 1:
public class quest1 {
public quest1(String... mynum) {
System.out.println("yee haa");
}
public static void main(String[] args) {
quest1 q=new quest1();
quest1 q1=new quest1("hello");
}
}
উদাহরণ 2:
public class quest1 {
public quest1(int... at) {
System.out.println("yee haa");
}
public quest1(String... at) {
System.out.println("yee haa");
}
public static void main(String[] args) {
quest1 q=new quest1("value");
quest1 q1=new quest1(1);
}
public void name(String ... s) {
}
}
আউটপুট:
ইয়ে হা
ইয়ে হা
সিনট্যাক্স: (ট্রিপল ডট ...) -> এর অর্থ আমরা শূন্য বা আরও বেশি বস্তু যুক্তির মাধ্যমে পাস করতে পারি বা টাইপের অবজেক্টের অ্যারে পাস করতে পারি।
public static void main(String[] args){}
public static void main(String... args){}
সংজ্ঞা: 1) অবজেক্ট ... আর্গুমেন্ট কেবলমাত্র অবজেক্টগুলির একটি অ্যারের রেফারেন্স।
2) ('স্ট্রিং []' বা স্ট্রিং ...) এটি যে কোনও সংখ্যক স্ট্রিং অবজেক্ট পরিচালনা করতে সক্ষম to অভ্যন্তরীণভাবে এটি রেফারেন্স টাইপ অবজেক্টের একটি অ্যারে ব্যবহার করে।
i.e. Suppose we pass an Object array to the ... argument - will the resultant argument value be a two-dimensional array - because an Object[] is itself an Object:
3) আপনি যদি একক যুক্তি দিয়ে পদ্ধতিটি কল করতে চান এবং এটি অ্যারে হিসাবে ঘটে থাকে তবে আপনাকে স্পষ্টভাবে এটিকে মোড়তে হবে
another. method(new Object[]{array});
OR
method((Object)array), which will auto-wrap.
অ্যাপ্লিকেশন: আর্গুমেন্টগুলির সংখ্যা গতিশীল হলে (রানটাইমটিতে আর্গুমেন্টের সংখ্যা জেনে থাকে) এবং ওভাররাইডে এটি প্রধানত ব্যবহৃত হয়। সাধারণ নিয়ম - পদ্ধতিতে আমরা যে কোনও ধরণের এবং যে কোনও সংখ্যক আর্গুমেন্ট পাস করতে পারি। আমরা কোনও নির্দিষ্ট যুক্তির আগে অবজেক্ট (...) যুক্তি যুক্ত করতে পারি না can অর্থাত
void m1(String ..., String s) this is a wrong approach give syntax error.
void m1(String s, String ...); This is a right approach. Must always give last order prefernces.