JavaRush /จาวาบล็อก /Random-TH /ตัวแปรโกลบอลใน Java: เมื่อใดจึงควรใช้?
Анзор Кармов
ระดับ
Санкт-Петербург

ตัวแปรโกลบอลใน Java: เมื่อใดจึงควรใช้?

เผยแพร่ในกลุ่ม
สวัสดี! ในบทความนี้เราจะพูดถึงตัวแปรทั่วโลก การประกาศ และตัวอย่างการใช้งานที่เหมาะสม หมายเหตุเล็กๆ น้อยๆ: เราจะไม่พิจารณาตัวแปรคลาสสากล ซึ่งก็คือตัวแปรที่สามารถเข้าถึงได้ภายในคลาสใดคลาสหนึ่ง เราจะพูดถึงตัวแปรส่วนกลางของแอปพลิเคชันทั้งหมด - ตัวแปรที่สามารถเข้าถึงได้ภายในแอปพลิเคชันทั้งหมด ตัวแปรโกลบอลใน Java: เมื่อใดจึงควรใช้?  - 1

วิธีสร้างตัวแปรโกลบอล

ตัวแปรร่วมคือตัวแปรที่สามารถเข้าถึงได้จากทุกที่ในแอปพลิเคชัน กล่าวอีกนัยหนึ่ง ขอบเขตคือแอปพลิเคชันทั้งหมด หากต้องการสร้างตัวแปรดังกล่าวใน Java คุณต้องสร้างตัวแปรสแตติกสาธารณะในคลาสสาธารณะ:
public class Example {
    public static int a;
    public static int b;
    public static String str;
}
ตัวแปรaและb- strได้กลายเป็นแบบโกลบอล เราสามารถเข้าถึงได้โดยตรงจากคลาสอื่นภายในแอปพลิเคชัน:
public class GlobalVarsDemo {
    public static void main(String[] args) {
        Example.a = 4;
        Example.b = 5;
        Example.str = "Global String variable value";

        System.out.println(Example.a);
        System.out.println(Example.b);
        System.out.println(Example.str);
    }
}
ถ้าเรารัน method mainเราจะเห็นผลลัพธ์ดังนี้:

4
5
Global String variable value
ตัวแปรทั่วโลกแบ่งได้เป็น 2 ประเภท คือ
  • ตัวแปรที่สามารถแก้ไขได้
  • ตัวแปรที่สามารถอ่านได้เท่านั้น
อย่างหลังเรียกว่าค่าคงที่โกลบอล ในการสร้างค่าคงที่ส่วนกลาง คุณต้องสร้างตัวแปรfinalและกำหนดค่าให้กับตัวแปรเมื่อกำหนดตัวแปร:
public class Constants {

    public static final double PI = 3.1415926535897932384626433832795;
    public static final String HELLO_WORLD_STR = "Hello, World!";

}
ตามหลักการตั้งชื่อ Java ค่าคงที่ทั้งหมดจะต้องตั้งชื่อเป็นตัวพิมพ์ใหญ่ โดยแยกคำด้วยอักขระขีดล่าง ดังนั้นเราจึงสร้างค่าคงที่ และตอนนี้เราไม่สามารถเปลี่ยนค่าของมันได้ตัวแปรโกลบอลใน Java: เมื่อใดจึงควรใช้?  - 2อย่างไรก็ตาม เราสามารถอ่านค่าของมันได้:
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println(Constants.HELLO_WORLD_STR);
    }
}
บทสรุป:

Hello, World!
public class ConstantsDemo {
    public static void main(String[] args) {
        double r = 10;
        String message = String.format("Площадь круга с радиусом %f=%f", r, getCircleSquare(r));
        System.out.println(message);

    }

    static double getCircleSquare(double r) {
        return Constants.PI * r * r;
    }
}
บทสรุป:

Площадь круга с радиусом 10,000000=314,159265

คุณควรใช้ตัวแปรส่วนกลางหรือไม่

มีบทความมากมายบนอินเทอร์เน็ต ข้อความหลักคือ: ตัวแปรทั่วโลกนั้นชั่วร้าย แย่ และแย่มาก จริงเหรอ? เรามาลองให้ข้อดีข้อเสียของตัวแปรทั่วโลกเพื่อให้ทุกคนสามารถสรุปผลของตนเองได้ ตัวแปรโกลบอลใน Java: เมื่อใดจึงควรใช้?  - 3เริ่มจากข้อเสียกันก่อน ลองจินตนาการถึงแอปพลิเคชันที่มีคลาสที่มีตัวแปรโกลบอลที่สามารถอ่านและแก้ไขได้ เมื่อเวลาผ่านไป จำนวนคลาสในโปรเจ็กต์ จำนวนตัวแปรโกลบอล และวิธีการที่ใช้ตัวแปรโกลบอล หรืออีกนัยหนึ่ง ขึ้นอยู่กับคลาสเหล่านั้น จะเพิ่มขึ้น เมื่อเวลาผ่านไป ตัวแปรส่วนกลางแต่ละตัวจะถูกอ่านในส่วนต่างๆ ของระบบเพื่อวัตถุประสงค์ที่แตกต่างกัน ค่าของตัวแปรสามารถอัพเดตได้ในส่วนต่างๆ ของระบบ ภาพรวมของโลกของแอปพลิเคชั่นนี้มีความซับซ้อนมากขึ้นอย่างเห็นได้ชัด และนำไปสู่ข้อเสียดังต่อไป นี้ :
  1. ลดความสามารถในการอ่านและเพิ่มความยากลำบากในการทำความเข้าใจโค้ด
  2. เพิ่มความซับซ้อนในการบำรุงรักษาโค้ด
  3. หากต้องการเปลี่ยนตัวแปรร่วมตัวหนึ่ง จำเป็นต้องวิเคราะห์โค้ดทั้งหมดเพื่อไม่ให้ตั้งค่าตัวแปรเป็นค่าที่ไม่ถูกต้องสำหรับส่วนอื่นๆ ของระบบ
  4. เพิ่มข้อผิดพลาดที่ยากต่อการแก้ไข

    ลองจินตนาการถึงตัวแปรโกลบอล ซึ่งเป็นอาร์เรย์ของอ็อบเจ็กต์ ตัวอย่างเช่น ในส่วนหนึ่งของระบบ คาดว่าสตริงในอาร์เรย์นี้ และในอีกส่วนหนึ่งของระบบ มีคนตัดสินใจใช้ตัวเลขทศนิยม ไม่น่าเป็นไปได้ที่ใครจะอยากเข้าใจสิ่งนี้

  5. ชื่อตัวแปรอาจเหมือนกันหากคุณใช้ตัวแปรร่วมในโค้ดของคุณ เช่นเดียวกับไลบรารีบางแห่งที่ใช้ตัวแปรร่วมด้วยเช่นกัน สิ่งนี้สามารถนำไปสู่ข้อผิดพลาดทั้งด้านข้างของแอปพลิเคชันของคุณและด้านข้างของไลบรารีที่คุณใช้อยู่
  6. เพิ่มการเชื่อมต่อระหว่างส่วนต่างๆ ของระบบที่ใช้ตัวแปรส่วนกลาง ในทางตรงกันข้าม คุณควรพยายามให้โค้ดมีความเชื่อมโยงกันอย่างหลวมๆ จะดีกว่าถ้ามีระบบย่อยเล็กๆ หลายระบบเชื่อมต่อกันแบบหลวมๆ แทนที่จะมีระบบย่อยหนักๆ เพียงระบบเดียว เพราะสมองจะจัดการกับเรื่องง่ายๆ หลายอย่างได้ง่ายกว่าเรื่องที่ซับซ้อนและสับสนเกินไป
  7. การเขียนการทดสอบหน่วยจะยากขึ้นเนื่องจากการทดสอบไม่ทราบว่าจำเป็นต้องใช้ตัวแปรส่วนกลางตัวใด และจำเป็นต้องเริ่มต้นอย่างไร
  8. ในแอปพลิเคชันแบบมัลติเธรด การใช้ตัวแปรโกลบอลตามเธรดที่แตกต่างกันนำไปสู่ข้อผิดพลาดที่เพิ่มขึ้นซึ่งยากต่อการดีบั๊ก และเพิ่มความซับซ้อนของโปรเจ็กต์ ด้วยเหตุนี้จึงจำเป็นต้องกำหนดค่าการเข้าถึงตัวแปรดังกล่าวให้ถูกต้องมากขึ้นโดยจัดให้มีการซิงโครไนซ์และการล็อค ซึ่งอาจนำไปสู่การลัดวงจรได้ในอนาคต ตัวอย่างเช่น เธรด A ได้ล็อกตัวแปร X สำหรับงานของตน และเธรด B ได้ล็อกตัวแปร Y สำหรับงานของตน และขณะนี้เธรด A ต้องการตัวแปร Y และเธรด B ต้องการตัวแปร X ผลก็คือ โปรแกรมจะหยุดทำงาน
แต่ทั้งหมดนี้ไม่ถูกต้อง นี่คือคำอธิบายของความเสี่ยง ความเป็นไปได้ที่จะเพิ่มขึ้นตามการเติบโตของโครงการและจำนวนตัวแปรทั่วโลกที่เพิ่มขึ้น มาดูข้อดีกัน :
  1. ในโปรเจ็กต์ขนาดเล็ก ตัวแปรโกลบอลคือสิ่งที่ง่ายที่สุดในการทำให้โปรเจ็กต์ทำงานได้
  2. บางครั้งความกลัวในการใช้ตัวแปรส่วนกลางก็นำไปสู่ความซับซ้อนมากขึ้นในโปรเจ็กต์ จากนั้นโปรแกรมเมอร์ก็เริ่มสร้างซิงเกิลตันและหันมาใช้รูปแบบการออกแบบอื่นๆ
  3. ในการเขียนโปรแกรม คุณมักจะต้องอาศัยค่าที่ไม่เปลี่ยนรูปบางอย่าง

    สิ่งที่สมเหตุสมผลที่สุดคือการเขียนค่าเช่นค่าคงที่เนื่องจากค่าคงที่เท่านั้นที่รับประกันได้ว่าค่าของตัวแปรจะไม่เปลี่ยนแปลงเมื่อเวลาผ่านไป ค่าคงที่ดังกล่าวสามารถพบได้ตลอดเวลา ( Integer.MAX_VALUE, Integer.MIN_VALUE, Boolean.TRUE, Collections.EMPTY_LISTฯลฯ) แต่การเขียนโปรแกรมไม่ได้จำกัดอยู่เพียงการใช้ไลบรารีมาตรฐานเท่านั้น บ่อยครั้งที่คุณต้องเขียนตรรกะเฉพาะบางอย่าง ซึ่งจะต้องอาศัยค่าคงที่เฉพาะของคุณเอง นั่นเป็นสาเหตุที่บางครั้งการใช้ค่าคงที่ (ตัวแปรส่วนกลางแบบอ่านอย่างเดียว) ทำให้ชีวิตง่ายขึ้นจริงๆ

โดยทั่วไป คุณไม่ควรใช้ตัวแปรร่วมมากเกินไป หากเป็นไปได้ ให้ใช้เฉพาะค่าคงที่เท่านั้น ก่อนหน้านี้มีการกล่าวกันว่าการใช้ตัวแปรโกลบอลในโครงการขนาดเล็กก็ไม่เลว แต่จะดีกว่าสำหรับนักพัฒนามือใหม่ที่จะไม่ใช้งานเลย ด้วยเหตุผลสองประการ:
  1. ทุกสิ่งที่นักพัฒนามือใหม่เขียนถือเป็นโครงการขนาดเล็ก และการใช้ตัวแปรส่วนกลางในโครงการของเขาจะสอนให้เขาใช้ตัวแปรส่วนกลางทุกที่
  2. เป็นการดีกว่าที่จะเรียนรู้ที่จะทำโดยไม่มี "เทคนิคต้องห้าม" ก่อน และด้วยประสบการณ์ ความเข้าใจว่าเมื่อใดเทคนิคดังกล่าวจึงเหมาะสมที่จะใช้จะเกิดขึ้นเอง
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION