JavaRush /وبلاگ جاوا /Random-FA /بیانیه بازگشت در جاوا
Viacheslav
مرحله

بیانیه بازگشت در جاوا

در گروه منتشر شد

معرفی

همانطور که می دانیم جاوا یک زبان برنامه نویسی شی گرا است. یعنی مفهوم اساسی، زیرا گفتن اساس مبانی این است که همه چیز یک شی است. اشیاء با استفاده از کلاس ها توصیف می شوند. بیانیه بازگشت در جاوا - 1طبقات به نوبه خود حالت و رفتار دارند. به عنوان مثال، یک حساب بانکی ممکن است حالتی به شکل مقدار پول موجود در حساب داشته باشد و رفتار افزایش و کاهش موجودی داشته باشد. رفتار در جاوا با استفاده از روش ها پیاده سازی می شود. نحوه توصیف روش ها در همان ابتدای سفر یادگیری جاوا شما معرفی شده است. به عنوان مثال، در آموزش رسمی اوراکل: " تعریف روش ها ". در اینجا دو جنبه مهم وجود دارد:
  • هر روش یک امضا دارد. امضا شامل نام روش و پارامترهای ورودی آن است.
  • متدها باید نوع بازگشتی را مشخص کنند.
  • نوع برگشتی بخشی از امضای متد نیست.
باز هم، این نتیجه این واقعیت است که جاوا یک زبان قوی تایپ شده است و کامپایلر می خواهد از قبل بفهمد که کدام نوع تا آنجا که ممکن است استفاده می شود. باز هم برای محافظت از ما در برابر اشتباهات. به طور کلی، همه چیز به نفع است. خوب، به نظر من، این یک بار دیگر فرهنگ مدیریت داده ها را در ما القا می کند. بنابراین، برای متدها نوع مقدار مشخص شده است. و برای برگرداندن همین مقدار از متدها از کلمه کلیدی استفاده می شود return.

عبارت بازگشت کلمه کلیدی در جاوا

کلمه کلیدی عبارت returnبه "گزاره های جریان کنترل" همانطور که در آموزش اوراکل " بیانیه های جریان کنترل " بحث شده است، اشاره دارد. همچنین می توانید در مورد نحوه برگرداندن مقادیر در آموزش رسمی بخوانید: " بازگرداندن یک مقدار از یک روش ". کامپایلر به دقت نظارت می کند، تا جایی که می تواند، مقدار بازگشتی از یک متد با نوع مقدار بازگشتی مشخص شده توسط متد مطابقت داشته باشد. بیایید از IDE آنلاین از tutorialspoint به عنوان مثال استفاده کنیم. بیایید به مثال اصلی نگاه کنیم:
public class HelloWorld {
    public static void main(String []args) {
        System.out.println("Hello World");
    }
}
همانطور که می بینیم، یک متد در اینجا اجرا می شود mainکه نقطه ورود به برنامه است. خطوط کد از بالا به پایین اجرا می شوند. روش ما mainنمی تواند مقادیر را برگرداند، در غیر این صورت یک خطا دریافت خواهیم کرد: " Error: Main method must return a value of type void". بنابراین، روش به سادگی به صفحه نمایش داده می شود. حال بیایید دریافت رشته را به یک روش جداگانه برای دریافت پیام منتقل کنیم:
public class HelloWorld {

    public static void main(String []args) {
        System.out.println(getHelloMessage());
    }

    public static String getHelloMessage() {
        return "Hello World";
    }

}
همانطور که می بینیم با استفاده از کلمه کلیدی returnمقدار بازگشتی را مشخص کردیم که بعداً در متد استفاده کردیم println. در توضیح (تعریف) روش، getHelloMessageنشان دادیم که ما را برمی گرداند String. این به کامپایلر اجازه می دهد تا بررسی کند که اقدامات متد با روشی که اعلام شده است مطابقت دارد. به طور طبیعی، نوع مقدار بازگشتی مشخص شده در تعریف روش می‌تواند وسیع‌تر از نوع مقدار بازگشتی از کد باشد. نکته اصلی این است که انواع به یکدیگر کاهش می یابد. در غیر این صورت یک خطای زمان کامپایل دریافت خواهیم کرد: " error: incompatible types". به هر حال، احتمالاً بلافاصله این سؤال مطرح شد: چرا returnبرای اپراتورهای کنترل جریان برنامه اعمال می شود؟ اما چون می تواند جریان عادی برنامه را از بالا به پایین مختل کند. مثلا:
public class HelloWorld {

    public static void main(String []args){
        if (args.length == 0)  {
            return;
        }
        for (String arg : args)  {
            System.out.println(arg);
        }
    }

}
همانطور که از مثال مشخص است، اگر برنامه جاوا ما بدون پارامتر فراخوانی شود، اجرای متد را قطع می کنیم main. مهم است که به یاد داشته باشید که اگر returnکد را داشته باشید، غیرقابل دسترسی می شود. و کامپایلر هوشمند ما متوجه این موضوع می شود و به شما اجازه اجرای چنین برنامه ای را نمی دهد. به عنوان مثال، این کد کامپایل نمی شود:
public static void main(String []args) {
        System.out.println("1");
        return;
        System.out.println("2");
 }
یک هک کثیف برای دور زدن این وجود دارد. به عنوان مثال، برای اهداف اشکال زدایی یا به دلایل دیگر. کد بالا را می توان با قرار دادن آن returnدر ifیک بلوک برطرف کرد:
if (2==2)  {
    return;
}

بیانیه بازگشت در رسیدگی به خطا

یک شرایط بسیار دشوار وجود دارد - ما می توانیم از آن returnدر ارتباط با مدیریت خطا استفاده کنیم. من می خواهم بلافاصله بگویم که استفاده از آن returnدر catchیک بلوک بسیار بسیار بد است، بنابراین باید از آن اجتناب کنید. اما ما به یک مثال نیاز داریم، درست است؟ او اینجا است:
public class HelloWorld  {

    public static void main(String []args) {
        System.out.println("Value is: " + getIntValue());
    }

    public static int getIntValue()  {
        int value = 1;
        try {
            System.out.println("Something terrible happens");
            throw new Exception();
        } catch (Exception e) {
            System.out.println("Catched value: " + value);
            return value;
        } finally {
            value++;
            System.out.println("New value: " + value);
        }
    }

}
در نگاه اول به نظر می رسد که 2 باید برگردانده شود، زیرا finallyهمیشه اجرا می شود. اما خیر، مقدار 1 خواهد بود و تغییر به متغیر in finallyنادیده گرفته می شود. علاوه بر این، اگر valueحاوی یک شی بود و ما finallyگفتیم value = null، catchباز هم ارجاع به شی را برمی‌گرداند، نه null. اما از بلوک finallyاپراتور returnبه درستی کار می کرد. همکاران به وضوح از شما برای چنین هدیه ای تشکر نمی کنند.
دیگر چه بخوانیم:

بیانیه بازگشت

void.class

و در نهایت. شما می توانید یک ساخت عجیب و غریب مانند void.class. به نظر می رسد، چرا و چه چیزی است؟ در واقع، در چارچوب‌های مختلف و موارد دشواری که از Java Reflection API استفاده می‌شود ، این ممکن است بسیار ضروری باشد. به عنوان مثال، می توانید بررسی کنید که یک متد چه نوع را برمی گرداند:
import java.lang.reflect.Method;

public class HelloWorld {

    public void getVoidValue() {
    }

    public static void main(String[] args) {
        for (Method method : HelloWorld.class.getDeclaredMethods()) {
            System.out.println(method.getReturnType() == void.class);
        }
    }
}
این می تواند در چارچوب های آزمایشی مفید باشد که در آن نیاز به جایگزینی کد واقعی روش ها است. اما برای انجام این کار، باید بدانید که این روش چگونه رفتار می کند (یعنی چه نوع هایی را برمی گرداند). راه دومی برای پیاده سازی متد mainاز کد بالا وجود دارد:
public static void main (String[] args) {
        for (Method method : HelloWorld.class.getDeclaredMethods()) {
            System.out.println(method.getReturnType() == Void.TYPE);
        }
 }
یک بحث نسبتاً جالب در مورد تفاوت بین آنها را می توان در stackoverflow خواند: تفاوت بین java.lang.Void و void چیست؟ #ویاچسلاو
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION