دامنه متغیرهای جاوا — به زبان ساده

آخرین به‌روزرسانی: ۲۲ دی ۱۳۹۸
زمان مطالعه: ۲ دقیقه
دامنه متغیرهای جاوا

هر متغیر در زبان برنامه‌نویسی جاوا یک دامنه دارد. منظور از دامنه بخشی از برنامه است که در آن می‌توان از متغیر استفاده کرد و متغیر در آن حوزه معتبر خواهد بود. در این مقاله به معرفی دامنه متغیرهای جاوا پرداخته و تفاوت بین آن‌ها را مورد بررسی قرار می‌دهیم.

دامنه کلاس

هر متغیر که درون یک براکت کلاس {} و با مادیفایر دسترسی «خصوصی» (private) اعلان شود و خارج از همه متدها باشد، دارای دامنه کلاس است. در نتیجه این متغیرها می‌توانند در همه بخش‌های کلاس مورد استفاده قرار گیرند، اما امکان استفاده از آن‌ها در خارج از کلاس وجود ندارد:

public class ClassScopeExample {
    private Integer amount = 0;
    public void exampleMethod() {
        amount++;
    }
    public void anotherExampleMethod() {
        Integer anotherAmount = amount + 4;
    }
}

چنان که می‌بینیم ClassScopeExample دارای متغیر کلاس amount است که از درون کلاس و متدهای آن قابل دسترسی است.

دامنه متد

زمانی که یک متغیر درون یک متد تعریف شود، دارای دامنه متد است و تنها درون همان متد معتبر خواهد بود:

public class MethodScopeExample {
    public void methodA() {
        Integer area = 2;
    }
    public void methodB() {
        // compiler error, area cannot be resolved to a variable
        area = area + 2;
    }
}

در کد فوق در methodA یک متغیر متد به نام area ایجاد کردیم. به همین جهت، می‌توانیم از area درون method استفاده کنیم، اما امکان استفاده از این متغیر در هر جایی خارج از این متد وجود ندارد.

دامنه حلقه

اگر متغیری را درون یک حلقه اعلان کنیم، دارای دامنه حلقه بوده و تنها درون همان حلقه در دسترس ما خواهد بود:

public class LoopScopeExample {
    List<String> listOfNames = Arrays.asList("Joe", "Susan", "Pattrick");
    public void iterationOfNames() {
        String allNames = "";
        for (String name : listOfNames) {
            allNames = allNames + " " + name;
        }
        // compiler error, name cannot be resolved to a variable
        String lastNameUsed = name;
    }
}

چنان که می‌بینیم در کد فوق متد iterationOfNames دارای یک متغیر متد به نام name است. این متغیر تنها می‌تواند درون حلقه مورد استفاده قرار گیرد و خارج از آن معتبر نیست.

دامنه براکت

دامنه‌های دیگر را می‌توانیم هر جایی با استفاده از براکت {} تعریف کنیم:

public class BracketScopeExample {    
    public void mathOperationExample() {
        Integer sum = 0;
        {
            Integer number = 2;
            sum = sum + number;
        }
        // compiler error, number cannot be solved as a variable
        number++;
    }
}

متغیر number تنها درون براکت‌ها معتبر است.

دامنه‌ها و ابهام متغیر

تصور کنید یک متغیر کلاس داریم و می‌خواهیم یک متغیر متد با همان نام اعلان کنیم:

public class NestedScopesExample {
    String title = "Faradars ";
    public void printTitle() {
        System.out.println(title);
        String title = "John Doe";
        System.out.println(title);
    }
}

نخستین باری که title را پرینت بگیریم عبارت Faradars نمایش می‌یابد. پس از آن یک متغیر متد با همان نام اعلان شده و مقدار John Doe به آن انتساب یافته است. متغیر متد title امکان دسترسی به متغیر کلاس title را باطل می‌سازد. به همین دلیل بار دوم که title را پرینت بگیریم، با عبارت John Doe مواجه می‌شویم. این وضعیت سردرگم‌کننده به نام «ابهام متغیر» (variable shadowing) نامیده می‌شود و رویه مناسبی به حساب نمی‌آید. در این حالت بهتر است از یک پیشوند برای دسترسی به متغیر مانند this.title استفاده کنیم.

سخن پایانی

در این مقاله با دامنه‌های مختلف جاوا آشنا شدیم. سورس کد این مقاله را می‌توانید در این ریپوی گیت‌هاب (+) ملاحظه کنید.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
baeldung

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *