در آموزش نحوۀ تعریف متد در زبان برنامهنویسی جاوا، با چگونگی تعریف یک متد آشنا شدیم و در این آموزش قصد داریم تا به بررسی نحوۀ تعریف پارامتر ورودی برای متدها در زبان برنامهنویسی جاوا پرداخته و ببینیم که چگونه میتوان دادهای را به عنوان آرگومان ورودی به متد مورد نظر پاس داده و آن را فراخوانی کرد.
پیش از شروع آموزش، یک پروژۀ جدید تحت عنوان PassingDataToMethods در محیط برنامهنویسی اکلیپس ایجاد کرده و کلاسی به نام MainClass در آن میسازیم. حال برای روشن شدن مطالب ارائهشده در این آموزش سناریویی را در نظر میگیریم که در آن فرض میکنیم والدین یا همسرمان از ما میخواهند تا به سوپرمارکت رفته و اقلام مورد نیاز خود را خریداری کنیم. به عبارتی، باید به سوپرمارکت رفته و کاری را انجام دهیم که در چنین شرایطی میتوانیم این کار را به عنوان تَسکی داخل یک متد تعریف کرده و آن را پیادهسازی نماییم. به علاوه، میتوانیم اقلام مورد نیاز برای خرید را به منزلۀ آرگومانی در نظر بگیریم که باید به متد مورد نظر پاس داده شده و کار خرید روی آنها انجام شود.
با توجه به آنچه در بالا بدان اشاره کردیم، متدی تحت عنوان ()goToSuperMarket را در نظر گرفته و در ادامه دستوراتی مبنی بر چاپ استرینگ مربوط به نام آیتمهای مورد نیاز را داخل آن پیادهسازی مینماییم که برای این منظور میتوانیم هر یک از آیتمهای مد نظر برای خرید همچون «نان» و «پنیر» را به عنوان آرگومان ورودی به متد مذکور پاس دهیم تا عمل خریدن روی آنها انجام شود.
در چنین شرایطی، اگر بخواهیم متد فوق را به منظور انجام کار روی آیتم «نان» فراخوانی کنیم، میباید از دستوری به صورت ;("goToSuperMarket("bread استفاده کنیم (توجه داشته باشیم که نام ورودی در قالب دیتایی از جنس استرینگ بوده و مابین علائم " " به آن پاس داده میشود.) در واقع، آیتم نان به عنوان آرگومانی است که در لحظه به متد ()goToSuperMarket اضافه شده است. اکنون اگر تصمیم خود را عوض کرده و بخواهیم موردی همچون «پنیر» را از سوپرمارکت خریداری نماییم، میتوانیم آیتم مورد نظر را به عنوان آرگومان ورودی در نظر گرفته و این بار استرینگی مانند «cheese» را با استفاده از دستور ;("goToSuperMarket("cheese به متد مورد نظر پاس دهیم. به علاوه، در صورت تمایل به خرید هر دو مورد هم میتوانیم متد ()goToSuperMarket را به صورت ;("goToSuperMarket("bread", "cheese فراخوانی نماییم.
| نکته |
| نوع و همچنین تعداد پارامترهای ورودیِ تعریفشده برای متد بسیار مهم بوده و به ترتیب، تعیینکنندۀ دیتا تایپ مربوط به آرگومان ورودی و تعداد آنها در هنگام فراخوانی متد مذکور میباشند. به عبارت دیگر، در هنگام فراخوانی یک متد، دیتا تایپ و تعداد آرگومانهای ورودی به آن میباید دقیقاً مشابه با دیتا تایپ مورد استفاده در تعریف پارامترهای ورودی و همچنین تعداد آنها باشند. |
به طور کلی، اضافه کردن یک پارامتر یا لیستی از پارامترها به یک متد منجر به افزایش کارایی متد مذکور میشود به طوری که مثلاً به جای آنکه متد مورد نظر در هر بار اجرا یکسری دستور را روی دیتایی از پیش تعریفشده اجرا کرده و خروجی مشابهی داشته باشد، میتوان در صورت نیاز دیتای متفاوتی را به آن داده و دستورات تعریفشده برای متد مربوطه را روی آرگومان یا آرگومانهای مورد نظر اجرا کرد.
برای مثال، در رابطه با سناریوی مطرحشده در این آموزش نیز میتوان گفت که تعریف پارامتر ورودی برای متد ()goToSuperMarket به منزلۀ افزودن قابلیتی جهت خرید تعداد اقلام دلخواه از سوپرمارکت میباشد به طوری که میتوانیم یک بار برای خرید نان، بار دیگر برای خرید پنیر یا حتی خرید بستنی به سوپر مارکت برویم!
در این مرحله از آموزش و به منظور روشنتر شدن توضیحات فوق، در ادامه این مفاهیم را در قالب سناریوی فوقالذکر پیادهسازی میکنیم و برای این منظور کلاسی که در ابتدای این آموزش ایجاد کردیم را به شکل زیر تکمیل میکنیم:
public class MainClass {
String mySentence = "Dear son go to supermarket and also buy some ";
public void goToSuperMarket() {
System.out.println(mySentence);
}
}
در کد فوق، آبجکتی از روی کلاس String تحت عنوان mySentence تعریف کرده و استرینگ « Dear son go to supermarket and also buy some» را بدان منتسب کردهایم سپس متدی با سطح دسترسیِ public تحت عنوان ()goToSuperMarket ساختهایم که این متد قرار نیست دیتایی را در خروجی ریترن کند و از همین روی آن را از جنس void تعریف کردهایم. به عبارت دیگر، متد ()goToSuperMarket صرفاً این وظیفه را دارا است تا استرینگ منتسب به آبجکت mySentence مبنی بر «درخواست برای خرید چیزی» را روی صفحۀ کنسول چاپ کرده و در ادامه نام آیتم مورد نیاز برای خرید را به همراه استرینگ مذکور در کنسول چاپ نماید.
اکنون با استفاده از کلاس String آبجکتی تحت عنوان something تعریف کرده و آن را به عنوان پارامتر ورودی برای متد خود در نظر میگیریم تا بدین وسیله بتوانیم استرینگ مربوط به نام آیتم مورد نظر خود را به آن پاس دهیم که برای این منظور کد فوق را به صورت زیر بازنویسی مینماییم:
public class MainClass {
String mySentence = "Dear son go to supermarket and also buy some ";
public void goToSuperMarket(String something) {
System.out.println(mySentence);
}
}
همانطور که مشاهده میکنیم، داخل پرانتز مقابل نام متد یک آبجکت از جنس کلاس String تحت عنوان something تعریف کردهایم و همانطور که پیشتر اشاره کردیم این متد وظیفه دارد تا در صورت فراخوانی، استرینگ مربوط درخواست برای خرید چیزی را به همراه استرینگ مربوط به نام آیتم مد نظر گرفته و آنها را با یکدیگر کانکت کرده سپس روی صفحۀ کنسول چاپ میکند. حال دستورات داخلی این متد مبنی بر نمایش استرینگ مربوط به دستور خرید چیزی به همراه آرگومان ورودی را به صورت زیر در برنامۀ خود اضافه مینماییم:
public class MainClass {
String mySentence = "Dear son go to supermarket and also buy some ";
public void goToSuperMarket(String something) {
System.out.println(mySentence + something);
}
}
در این مرحله، در صورت فراخوانی متد فوق میباید استرینگی را به عنوان آرگومان ورودی بدان پاس دهیم که بدین ترتیب استرینگ ورودی به آبجکت something منتسب شده و به همراه استرینگ اختصاصیافته به آبجکت mySentence در کنسول چاپ میشوند که در همین راستا جهت فراخوانی متد ()goToSuperMarket یک کلاس دیگر تحت عنوان ActionClass داخل پروژۀ PassingDataToMethods ایجاد کرده و آن را به عنوان نقطۀ شروع برنامۀ خود قرار میدهیم و از همین روی در حین ساخت کلاس هم تیک گزینۀ public static void main را میزنیم تا جایی که کد مربوط به فایل ActionClass در ابتدا به صورت زیر خواهد بود:
public class ActionClass {
public static void main(String[] args) {
}
}
اکنون در متد ()main داخل کلاس ActionClass آبجکتی از روی کلاس MainClass به روش زیر میسازیم:
public class ActionClass {
public static void main(String[] args) {
MainClass myShopping = new MainClass();
}
}
در کد فوق، مشابه آنچه که در آموزش مقدمهای بر مفهوم شیئگرایی در زبان برنامهنویسی جاوا بیان کردیم، برای ساخت آبجکت از روی کلاس MainClass بدین صورت عمل میکنیم که ابتدا نام کلاس را نوشته و در ادامه نام myShopping را برای آبجکت مورد نظر انتخاب میکنیم سپس با استفاده از کیورد new و مجدداً ذکر نام کلاس به کامپایلر جاوا دستور میدهیم که آبجکتی جدید از روی کلاس MainClass ساخته و آن را با استفاده از عملگر = به myShopping منتسب نماید. در این مرحله میتوانیم روی آبجکت جدید ساختهشده از روی کلاس MainClass متد مد نظر خود را در کلاس مذکور فراخوانی نماییم و برای این منظور کد فوق را به شکل زیر تکمیل میکنیم:
public class ActionClass {
public static void main(String[] args) {
MainClass myShopping = new MainClass();
myShopping.goToSuperMarket();
}
}
همانطور که مشاهده میکنیم، برای فراخوانی متد ()goToSuperMarket ابتدا نام آبجکت جدید ساختهشده را نوشته سپس یک . قرار داده و در ادامه نام متد تعریفشده در کلاس مربوطه را مینویسیم و در پایان دستور نیز یک علامت ; قرار میدهیم. در این مرحله به محض سِیو کردن برنامۀ فوق، محیط برنامهنویسی اکلیپس با قرار دادن نقطهچین دور نام متد خطایی را در قالب عبارت زیر در معرض دید ما قرار میدهد:
The method goToSuperMarket(String) in the type MainClass is not applicable for the arguments ()در واقع، ارور فوق از آنجایی ناشی میشود که متد ()goToSuperMarket را با یک پارامتر ورودی از جنس کلاس String تعریف کرده اما آن را بدون هیچ آرگومانی فراخوانی نمودهایم که آیدیای اکلیپس نیز به منظور رفع مشکل به وجود آمده پیشنهاد پاس دادن مقداری از جنس کلاس String را به عنوان آرگومان ورودی به این متد ارائه میکند. بنابراین به منظور فرخوانی متد ()goToSuperMarket نیاز است تا استرینگ مربوط به نام آیتم مد نظر را به عنوان ورودی و داخل علائم " " بدان پاس دهیم که برای این منظور کد فوق را به صورت زیر تکمیل مینماییم:
public class ActionClass {
public static void main(String[] args) {
MainClass myShopping = new MainClass();
myShopping.goToSuperMarket("bread");
}
}
همانطور که مشاهده میکنیم، استرینگ «bread» را به عنوان آرگومان ورودی به متد ()goToSuperMarket پاس دادهایم که با اجرای برنامۀ فوق استرینگ مذکور با استرینگ منتسب به آبجکت mySentence کانکت شده و در کنسول چاپ میگردد به طوری که در خروجی خواهیم داشت:
Dear son go to supermarket and also buy some bread
حال اگر بخواهیم مثلاً آیتم دیگری همچون «پنیر» را خریدار نماییم، میتوانیم استرینگ مربوط به نام آن را به جای استرینگ قبلی به متد ()goToSuperMarket پاس دهیم تا دستورات تعریفشده برای این متد روی آرگومان ورودی جدید نیز اِعمال گردند به طوری که به روش زیر استرینگ «cheese» را به عنوان آرگومان ورودی به متد مذکور پاس داده و آن را فراخوانی مینماییم:
public class ActionClass {
public static void main(String[] args) {
MainClass myShopping = new MainClass();
myShopping.goToSuperMarket("cheese");
}
}
مشابه آنچه در مثال پیشین توضیح دادیم، استرینگ «cheese» به آبجکت something منتسب شده و به همراه استرینگ اختصاصیافته به آبجکت mySentence در کنسول چاپ میگردد به طوری که با اجرای برنامۀ فوق در خروجی خواهیم داشت:
Dear son go to supermarket and also buy some cheese
همانطور که میبینیم، با تعریف پارامتر ورودی برای متد ()goToSuperMarket توانستیم تا به صورت اصطلاحاً Real-time ورودی مورد نظر خود را به متد مربوطه پاس داده و بدین ترتیب دستورات تعریفشده برای متد مذکور روی دیتای ورودی اجرا شده و خروجی متناسب با دیتای دریافتشده را به دست آوردیم.
