JavaRush /Java Blogu /Random-AZ /Java-da Qaytarma Bəyanatı
Viacheslav
Səviyyə

Java-da Qaytarma Bəyanatı

Qrupda dərc edilmişdir

Giriş

Bildiyimiz kimi Java obyekt yönümlü proqramlaşdırma dilidir. Yəni əsas anlayış, çünki əsasların əsasını demək hər şeyin bir obyekt olmasıdır. Obyektlər siniflərdən istifadə etməklə təsvir olunur. Java-da qaytarma bəyanatı - 1Siniflər də öz növbəsində vəziyyətə və davranışa malikdirlər. Məsələn, bir bank hesabı hesabdakı pul məbləği şəklində bir vəziyyətə sahib ola bilər və balansı artırma və azaltma davranışına sahib ola bilər. Java-da davranış metodlardan istifadə etməklə həyata keçirilir. Metodları necə təsvir etmək Java öyrənmə səyahətinizin ən əvvəlində təqdim olunur. Məsələn, Oracle-ın rəsmi təlimatında: “ Metodların müəyyən edilməsi ”. Burada iki mühüm cəhət var:
  • Hər bir metodun imzası var. İmza metodun adından və onun daxiletmə parametrlərindən ibarətdir;
  • Metodlar qaytarma növünü müəyyən etməlidir;
  • Qaytarma növü metod imzasının bir hissəsi deyil.
Yenə də bu, Java-nın güclü tipli bir dil olması və tərtibçinin mümkün qədər harada istifadə olunduğunu əvvəlcədən anlamaq istəməsinin nəticəsidir. Yenə bizi səhvlərdən qorumaq üçün. Ümumiyyətlə, hər şey xeyirxahlıq üçündür. Mənə elə gəlir ki, bu bir daha bizə məlumatlarla işləmək mədəniyyətini aşılayır. Beləliklə, metodlar üçün dəyər növü müəyyən edilir. Metodlardan eyni dəyəri qaytarmaq üçün açar sözdən istifadə olunur return.

Java-da açar söz qaytarma ifadəsi

Bəyanat açar sözü returnoracle təlimatında müzakirə edildiyi kimi "nəzarət axını bəyanatlarına" istinad edir " Nəzarət axını hesabatları ". Dəyərləri necə qaytarmaq barədə rəsmi dərslikdə də oxuya bilərsiniz: “ Metoddan dəyərin qaytarılması ”. Kompilyator öz imkanları daxilində diqqətlə izləyir ki, metoddan qaytarılan dəyər metod tərəfindən müəyyən edilmiş qaytarılan dəyər növünə uyğun gəlir. Nümunə olaraq tutorialspoint-dən Onlayn IDE-dən istifadə edək. Orijinal nümunəyə baxaq:
public class HelloWorld {
    public static void main(String []args) {
        System.out.println("Hello World");
    }
}
Gördüyümüz kimi burada mainproqrama giriş nöqtəsi olan metod icra olunur. Kod sətirləri yuxarıdan aşağı yerinə yetirilir. Metodumuz maindəyərləri qaytara bilməz, əks halda xəta alacağıq: " Error: Main method must return a value of type void". Buna görə də, metod sadəcə ekrana çıxacaq. İndi sətirin qəbulunu mesajın alınması üçün ayrıca metoda köçürək:
public class HelloWorld {

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

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

}
Gördüyümüz kimi, açar sözdən istifadə edərək returndaha sonra metodda istifadə etdiyimiz qaytarma dəyərini təyin etdik println. Metodun təsvirində (tərifində) getHelloMessageonun bizə qayıdacağını qeyd etdik String. Bu, kompilyatora metodun hərəkətlərinin elan edilmə üsulu ilə uyğunluğunu yoxlamağa imkan verir. Təbii ki, metodun tərifində göstərilən qaytarma dəyərinin növü koddan qaytarılan dəyərin növündən daha geniş ola bilər, yəni. Əsas odur ki, növlər bir-birinə azaldılır. Əks halda biz tərtib vaxtı xətası alacağıq: " error: incompatible types". Yeri gəlmişkən, yəqin ki, dərhal sual yarandı: Nə üçün returnbu, proqram axını idarə edən operatorlara aiddir? Lakin proqramın yuxarıdan aşağıya normal gedişatını poza biləcəyi üçün. Misal üçün:
public class HelloWorld {

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

}
Nümunədən göründüyü kimi mainjava proqramımız parametrsiz çağırılırsa metodun icrasını kəsirik. Yadda saxlamaq vacibdir ki, əgər o zaman returnkodunuz varsa, o, əlçatmaz olur. Və bizim ağıllı kompilyator bunu görəcək və belə bir proqramı işlətməyə imkan verməyəcək. Məsələn, bu kod tərtib edilməyəcək:
public static void main(String []args) {
        System.out.println("1");
        return;
        System.out.println("2");
 }
Bunun ətrafında olmaq üçün çirkli bir hack var. Məsələn, sazlama məqsədləri üçün və ya başqa bir səbəbdən. returnYuxarıdakı kodu bloka sarmaqla düzəldilə bilər if:
if (2==2)  {
    return;
}

Səhvlərin idarə edilməsində ifadəni qaytarın

Çox çətin bir vəziyyət var - biz onu returnsəhvlərin idarə edilməsi ilə birlikdə istifadə edə bilərik. Dərhal demək istərdim ki, onu returnblokda istifadə etmək catchçox, çox pis formadır, ona görə də bundan qaçınmalısınız. Amma bizə bir nümunə lazımdır, elə deyilmi? Budur o:
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);
        }
    }

}
İlk baxışdan 2-ni qaytarmaq lazımdır, çünki finallyhəmişə icra olunur. Ancaq yox, dəyər 1 olacaq və dəyişənə edilən dəyişiklik finallynəzərə alınmayacaq. Üstəlik, əgər onun valuetərkibində obyekt varsa və biz finallydediksə value = null, o, catchyenə də obyektə deyil, istinadı qaytaracaq null. Amma blokdan finallyoperator returndüzgün işləyəcəkdi. Həmkarlar belə bir hədiyyə üçün sizə açıq şəkildə təşəkkür etməyəcəklər.
Başqa nə oxumaq lazımdır:

geri qaytarma bəyanatı

boş.sinif

Və nəhayət. kimi qəribə konstruksiya yaza bilərsiniz void.class. Görünür, niyə və nə məqsədlə? Əslində, Java Reflection API-nin istifadə edildiyi müxtəlif çərçivələrdə və çətin hallarda bu çox lazım ola bilər. Məsələn, metodun hansı növü qaytardığını yoxlaya bilərsiniz:
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);
        }
    }
}
Bu, real metodlar kodunu əvəz etmək lazım olan test çərçivələrində faydalı ola bilər. Ancaq bunu etmək üçün bu metodun necə davrandığını (yəni, hansı növləri qaytardığını) başa düşməlisiniz. mainYuxarıdakı koddan metodu həyata keçirməyin ikinci yolu var :
public static void main (String[] args) {
        for (Method method : HelloWorld.class.getDeclaredMethods()) {
            System.out.println(method.getReturnType() == Void.TYPE);
        }
 }
Aralarındakı fərqin kifayət qədər maraqlı müzakirəsini stackoverflow-da oxumaq olar: java.lang.Void və void arasındakı fərq nədir? #Viaçeslav
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION