CodeGym /وبلاگ جاوا /Random-FA /کلمه کلیدی بازگشتی جاوا
John Squirrels
مرحله
San Francisco

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

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

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

همانطور که در آموزش Oracle در اینجا توضیح داده شده است، کلمه کلیدی بازگشت یک دستور جریان کنترل است . همچنین می‌توانید در مورد نحوه برگرداندن مقادیر در بخش « بازگرداندن مقدار از روش » آموزش رسمی بخوانید. کامپایلر به دقت پیگیری می کند که آیا می تواند اطمینان حاصل کند که مقدار بازگشتی یک روش با نوع بازگشتی مشخص شده مطابقت دارد یا خیر. بیایید از IDE آنلاین Tutorialspoint برای در نظر گرفتن یک مثال استفاده کنیم. بیایید به مثال اولیه نگاه کنیم:
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}
همانطور که می بینیم، متد اصلی در اینجا اجرا می شود که نقطه ورود برنامه است. خطوط کد از بالا به پایین اجرا می شوند. روش اصلی ما نمی تواند مقداری را برگرداند. اگر بخواهیم مقداری را در آنجا برگردانیم، با یک خطا مواجه خواهیم شد: "خطا: روش اصلی باید مقداری از نوع void را برگرداند" . بر این اساس، روش به سادگی به صفحه نمایش خروجی می دهد. حالا بیایید رشته را به روشی جداگانه برای تولید پیام منتقل کنیم:
public class HelloWorld {

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

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

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

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

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

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

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

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

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

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

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