ตัวแปรโกลบอลใน Java


217

คุณกำหนดตัวแปร Global ใน Java ได้อย่างไร?


20
คุณบอกเราได้ไหมว่าทำไมคุณถึงต้องการนิยามตัวแปรทั่วโลกใน Java?
Adam Paynter

44
หากต้องการเข้าถึงตัวแปรจากนอกชั้นเรียน
aTJ

5
บางทีคุณควรแก้ไขคำถามของคุณเพื่อใส่รหัสตัวอย่างที่แสดงให้เห็นอย่างชัดเจนถึงสิ่งที่คุณต้องการ มันจะช่วยให้เราแนะนำทางออกที่ดีที่สุด
Adam Paynter

7
@ อดัม: ฉันควรจะสามารถเปลี่ยนค่าของตัวแปรในชั้นหนึ่งจากชั้นเรียนอื่น
aTJ

2
คุณทำไม่ได้ ไม่มีตัวแปรทั่วโลกใน Java
มาร์ควิสแห่ง Lorne

คำตอบ:


261

เพื่อกำหนดตัวแปรส่วนกลางคุณสามารถใช้ประโยชน์จากคำหลักคงที่

public class Example {
    public static int a;
    public static int b;
}

ตอนนี้คุณสามารถเข้าถึง a และ b ได้จากทุกที่โดยการโทร

Example.a;

Example.b;

6
"Global" เป็นชื่อของคลาส
เจอโรม

12
ระวังเมื่อทำเช่นนี้ - เมื่อคลาส Global ถูกยกเลิกการโหลดตัวแปรจะไม่ได้ถูกกำหนดเป็นโมฆะ หากคุณขายแอปของคุณสิ่งนี้จะเกิดขึ้นไม่ช้าก็เร็วและคุณยังคงมองหาข้อผิดพลาดทุกที่ แต่ไม่ได้อยู่ในนั้น ...
user387184

10
staticคำหลักที่ทำให้ตัวแปรที่สามารถเข้าถึงได้ทั่วโลกในขณะที่ระดับของพวกเขาจะเต็มไป
sjas

22
เกี่ยวกับการยกเลิกการโหลดคลาส: หากมีห่วงโซ่อ้างอิงที่แข็งแกร่งจาก GC Root ใด ๆ ไปยังอินสแตนซ์ของ Global หรือลูก ๆ หรือการอ้างอิงเวลาคอมไพล์จากคลาสที่โหลดและไม่สามารถโหลดได้ไปยัง Global แล้ววัตถุ Class ที่สัมพันธ์กับ Global นั้นเป็นอย่างยิ่ง สามารถเข้าถึงได้และดังนั้นจึงเป็น ClassLoader ที่โหลดทั่วโลก; ซึ่งทำให้ไม่สามารถยกเลิกการโหลด Global (เนื่องจากการยกเลิกการโหลดคลาสสามารถเกิดขึ้นได้หลังจาก GC ลบการอ้างอิงที่คาดเดายากไปยัง ClassLoader ที่โหลดคลาสที่กำหนดเท่านั้น) หากคุณไม่มีการอ้างอิงเลยการขนถ่ายอาจเป็นปัญหาอย่างไร
Bruno Reis

4
@Abi ฉันขอแนะนำให้คุณเปลี่ยนชื่อชั้นเรียนของคุณGlobalเป็นอย่างอื่น ( TestClass?) เพื่อไม่ให้คนอื่นรู้สึกว่ามีสิ่งนั้นเป็นGlobalคำหลัก Java ปลอดภัยกว่าดีกว่าขออภัย :)
Nicolas Rinaudo

53

คุณทำไม่ได้ นั่นคือจากการออกแบบ คุณไม่ควรทำแม้ว่าคุณจะทำได้

ที่ถูกกล่าวว่าคุณสามารถสร้างชุดของสมาชิกคงที่สาธารณะในชั้นเรียนชื่อ Globals

public class Globals {
   public static int globalInt = 0;
   ///
}

แต่คุณไม่ควรทำ :) อย่างจริงจัง .. ไม่ทำ


6
แล้ววิธีไหนที่ดีกว่าที่ฉันจะประกาศค่าคงที่เพื่อให้วิธีการเรียนทั้งหมดสามารถเข้าถึงได้
Alston

6
โพสต์ของลักษณะนี้เป็นเหตุผลที่สามเณรพัฒนาความหวาดกลัวตัวแปรทั่วโลกและจากนั้นเราเห็นทุกประเภทของเทคนิคที่น่าเกรงขามถูกออกแบบมาเพื่อหลีกเลี่ยงข้อห้ามตัวแปรทั่วโลก แต่บรรลุผลเดียวกัน
Evgeni Sergeev

40
ลงคะแนนเพื่อพูดว่า "อย่าทำอย่างนั้น" โดยไม่ต้องอธิบายหรืออ้างถึงคำอธิบายว่าทำไม
Jeff McCune

4
@JeffMcCune: เพื่อให้คำสั่งของคุณชัดเจนยิ่งขึ้น "อย่าทำ" เป็นเรื่องที่น่ารังเกียจ ทำเมื่อมีประโยชน์ ตัวอย่างเช่นฉันต้องดีบักรหัสของฉันโดยใช้ IAbstractLoggerBullshit และแน่นอนว่า System.err ไม่ทำงานในสภาพแวดล้อมที่มีการทำข้อเสนอนี้ ฉันไม่สามารถทิ้งรหัสของฉันผ่านไปรอบ ๆ อึคนบันทึกข้อมูลระหว่างคลาสอะแด็ปเตอร์ที่ไร้ประโยชน์หลายร้อยรายการ
โจดังนั้น

6
ฉันจะทำมัน
Sunfish ลอยตัว

40

อีกวิธีคือสร้างอินเทอร์เฟซแบบนี้:

public interface GlobalConstants
{
  String name = "Chilly Billy";
  String address = "10 Chicken head Lane";
}

คลาสใด ๆ ที่จำเป็นต้องใช้จะต้องใช้อินเตอร์เฟส:

public class GlobalImpl implements GlobalConstants
{
  public GlobalImpl()
  {
     System.out.println(name);
  }
}

ฉันสงสัยว่าทำไมคำตอบนี้ไม่มีก่อนโหวต มันไม่ได้ให้คำตอบทางเลือกที่สมเหตุสมผลกับคำตอบอื่น ๆ ทั้งหมดหรือไม่?
M_M

12
Java ที่มีประสิทธิภาพโดย Joshua Bloch, บทที่ 4: คลาสและอินเทอร์เฟซ, รายการที่ 19: ใช้อินเตอร์เฟสเพื่อกำหนดประเภทเท่านั้น "รูปแบบอินเตอร์เฟสคงที่คือการใช้อินเตอร์เฟสที่ไม่ดี" หนังสือเล่มนี้คุ้มค่าที่จะอ่าน! :)
MariuszS

1
นอกจากนี้จาก JDK 1.5+ คุณสามารถใช้การนำเข้าแบบคงที่สำหรับตัวแปรโกลบอลของคุณได้โดยไม่จำเป็นต้องใช้งาน
MariuszS

9
.... ใช่แล้วมันไม่ได้อธิบายอะไรเลยเพียงแค่บอกว่าหนังสือบางเล่มบอกว่ามันแย่
linkhyrule5

14
นี่คือคำพูดสำหรับคุณ Oracle กล่าวว่า: "เพื่อหลีกเลี่ยงสิ่งนี้บางครั้งผู้คนใส่สมาชิกแบบสแตติกลงในอินเทอร์เฟซและสืบทอดจากอินเทอร์เฟซนั้นเป็นความคิดที่ไม่ดีอันที่จริงมันเป็นความคิดที่แย่ที่มีชื่อ: Constant Antipattern (ดูรายการ Java ที่มีประสิทธิภาพ 17) ปัญหาคือการใช้คลาสสมาชิกแบบสแตติกของคลาสอื่นเป็นเพียงรายละเอียดการใช้งานเท่านั้นเมื่อคลาสใช้อินเทอร์เฟซก็จะกลายเป็นส่วนหนึ่งของ API สาธารณะของชั้นเรียน API สาธารณะ "
Jolta

23

คุณควรใช้การฉีดแบบพึ่งพา:

public class Globals {
    public int a;
    public int b;
}

public class UsesGlobals {
    private final Globals globals;
    public UsesGlobals(Globals globals) {
        this.globals = globals;
    }
}

5
จริง แต่ฉันคิดว่าการใช้ "Globals" ของคุณทำให้สับสนเล็กน้อย :-) บางอย่างเช่น "พารามิเตอร์" จะเหมาะสมกว่าเนื่องจากไม่จำเป็นต้องเป็นสากล
Mark Peters

12

มีคำตอบที่ดีมากมาย แต่ฉันต้องการยกตัวอย่างนี้เนื่องจากมันถือว่าเป็นวิธีที่เหมาะสมกว่าในการเข้าถึงตัวแปรของคลาสโดยคลาสอื่นโดยใช้ getters และ setters

เหตุผลที่คุณใช้ getters และ setters ด้วยวิธีนี้แทนที่จะทำให้ตัวแปรสาธารณะเป็นดังนี้ ให้บอกว่า var ของคุณจะเป็นพารามิเตอร์ส่วนกลางที่คุณไม่ต้องการให้ใครบางคนเปลี่ยนแปลงระหว่างการทำงานของโปรแกรมของคุณ (ในกรณีที่คุณกำลังพัฒนาโค้ดกับทีม) สิ่งที่อาจเป็น URL สำหรับเว็บไซต์ ในทางทฤษฎีสิ่งนี้สามารถเปลี่ยนแปลงได้และอาจถูกใช้หลายครั้งในโปรแกรมของคุณดังนั้นคุณจึงต้องการใช้ var ส่วนกลางเพื่อให้สามารถอัปเดตได้ทั้งหมดในครั้งเดียว แต่คุณไม่ต้องการให้คนอื่นเข้ามาและเปลี่ยนแปลง var นี้ (อาจเป็นไปได้โดยไม่ทราบว่ามันสำคัญขนาดไหน) ในกรณีนั้นคุณไม่ต้องรวมเมธอด setter และรวมเฉพาะเมธอด getter เท่านั้น

public class Global{
    private static int var = 5;

    public static int getVar(){
        return Global.var;
    }

    //If you do not want to change the var ever then do not include this
    public static void setVar(int var){
        Global.var = var;
    }
}

10

ไม่มีตัวแปรโกลบอลใน Java

อย่างไรก็ตามสิ่งที่เรามีคือstaticคำหลักและนั่นคือทั้งหมดที่เราต้องการ ไม่มีสิ่งใดอยู่นอกคลาสใน Java staticคำหลักหมายถึงตัวแปรคลาสที่ตรงกันข้ามกับตัวแปรเช่นมีเพียงหนึ่งคัดลอกและฟันฝ่าว่าในทุกกรณีของชั้นเรียนที่สร้างขึ้นซึ่งหมายความว่าค่าของมันสามารถเปลี่ยนแปลงได้และเข้าถึงทั่วทุกกรณีที่จุดใด

หากคุณต้องการตัวแปรโกลบอลที่สามารถเข้าถึงได้นอกเหนือจากขอบเขตนี่คือตัวแปรที่คุณต้องการ แต่ขอบเขตนั้นมีอยู่เฉพาะที่คลาสนั้นและนั่นคือทั้งหมด


9

การพูดอย่างแท้จริงไม่มีแนวคิดของ"GLOBAL"ในโปรแกรม Java OO

อย่างไรก็ตามมีความจริงบางอย่างที่อยู่เบื้องหลังคำถามของคุณเพราะจะมีบางกรณีที่คุณต้องการใช้วิธีที่ส่วนใดส่วนหนึ่งของโปรแกรม ตัวอย่างเช่น --- random () วิธีการในแอป Phrase-O-Matic มันเป็นวิธีที่ควรจะเรียกจากทุกที่ของโปรแกรม

ดังนั้นเพื่อตอบสนองสิ่งต่าง ๆ ข้างบน "เราจำเป็นต้องมีตัวแปรและวิธีการเหมือนทั่วโลก"

เพื่อประกาศความหลากหลายทั่วโลก

 1.Mark the variable as public static final While declaring.

จะประกาศวิธี AS GLOBAL

 1. Mark the method as public static While declaring.

เนื่องจากฉันได้ประกาศตัวแปรและวิธีการแบบโกลบอลว่าเป็นแบบคงที่คุณสามารถเรียกมันได้ทุกที่ที่คุณต้องการเพียงแค่ใช้รหัสต่อไปนี้

ClassName.X

หมายเหตุ : X สามารถเป็นชื่อเมธอดหรือชื่อตัวแปรตามความต้องการและ ClassName เป็นชื่อของคลาสที่คุณประกาศ


9

ไม่มีอะไรควรเป็นระดับโลกยกเว้นค่าคงที่

public class MyMainClass {
    public final static boolean DEBUGMODE=true;
}

ใส่สิ่งนี้ไว้ในชั้นเรียนหลักของคุณ ในไฟล์. java อื่น ๆ ให้ใช้ผ่าน:

if(MyMainClass.DEBUGMODE) System.out.println("Some debugging info");

ตรวจสอบให้แน่ใจว่าเมื่อคุณย้ายรหัสออกจากพื้นห้องตัดและปล่อยคุณลบหรือแสดงความคิดเห็นการทำงานนี้

หากคุณมีวิธี workhorse เช่น randomizer ผมแนะนำให้สร้างแพ็คเกจ "Toolbox"! โคเดอร์ทั้งหมดควรมีหนึ่งตัวจากนั้นเมื่อใดก็ตามที่คุณต้องการใช้ใน. java เพียงแค่นำเข้ามัน!


5

ไม่มีสิ่งนั้นเป็นตัวแปรระดับโลกอย่างแท้จริงใน Java ตัวแปรแบบคงที่ทุกตัวจะต้องเป็นของบางคลาส (เช่น System.out) แต่เมื่อคุณตัดสินใจว่าจะใช้คลาสใดในนั้นคุณสามารถอ้างอิงได้จากทุก ๆ โหลดโดย classloader เดียวกัน

โปรดทราบว่าตัวแปรคงที่ควรได้รับการปกป้องเมื่อทำการอัพเดตเพื่อหลีกเลี่ยงสภาพการแข่งขัน


1
Java ไม่ให้ตัวแปรทั่วโลกตามหน้าที่ แต่ถ้าคุณต้องการที่จะมีแนวคิดตัวแปรทั่วโลกเราสามารถทำให้การใช้คำหลักคง
ซา


2
public class GlobalImpl {   

 public static int global = 5;

}

คุณสามารถโทรได้ทุกที่ที่คุณต้องการ:

GlobalImpl.global // 5

1

ในขณะที่คุณอาจเดาได้จากคำตอบไม่มีตัวแปรทั่วโลกใน Java และสิ่งเดียวที่คุณทำได้คือการสร้างคลาสที่มีสมาชิกแบบคงที่:

public class Global {
    public static int a;
}

คุณสามารถใช้กับGlobal.aที่อื่น อย่างไรก็ตามถ้าคุณใช้ Java 1.5 หรือดีกว่าคุณสามารถใช้import staticเวทย์มนตร์เพื่อทำให้มันดูเป็นตัวแปรทั่วโลกได้มากขึ้น:

import static test.Global.*;

public class UseGlobal {
    public void foo() {
        int i = a;
    }
}

และvoilà !

ตอนนี้มันยังห่างไกลจากแนวปฏิบัติที่ดีที่สุดอย่างที่คุณเห็นในโฆษณา: อย่าทำที่บ้าน


1

ไม่มีตัวแปรทั่วโลกใน Java แต่มีคลาสสากลที่มีเขตข้อมูลสาธารณะ คุณสามารถใช้คุณสมบัติการนำเข้าแบบคงที่ของ java 5 เพื่อทำให้มันดูเหมือนตัวแปรทั่วโลก


1

โดยทั่วไปแล้วตัวแปร Global (ฉันถือว่าคุณกำลังเปรียบเทียบกับ C, Cpp) กำหนดเป็น public static final

ชอบ

class GlobalConstant{
    public static final String CODE  = "cd";
}

ENUMs ยังมีประโยชน์ในสถานการณ์เช่นนี้:

ตัวอย่าง Calendar.JANUARY)


ตัวแปรทั่วโลกจำเป็นต้องเป็นที่สิ้นสุดหรือไม่? ทำไม?
Konerak

1
"final" หมายถึง "constant" ดังนั้นนี่คือค่าคงที่ทั่วโลก
duffymo

1
ไม่นั่นคือความหมายของตัวแปรทั่วโลกหากคุณต้องการแบ่งปันตัวแปรนั้นและเปลี่ยนข้อมูลจากนั้นเพียงลบfinalแต่ขึ้นอยู่กับวิธีที่คุณต้องการแบ่งปันที่คุณใช้และทุกอย่างแน่นอน
Jigar Joshi

ตัวอย่างประเภทCODEนี้คืออะไร? มันกำหนดไว้ที่ไหน
M_M

หมายเหตุ: CODE อยู่ในตัวพิมพ์ใหญ่ทั้งหมดเนื่องจากสัญกรณ์ Java ทั่วไปของมันจะใช้ตัวพิมพ์ใหญ่ทั้งหมดสำหรับตัวแปรที่คุณประกาศให้เป็นที่สุดและไม่ต้องการเปลี่ยนแปลงในระหว่างหลักสูตรของโปรแกรม
Dan Ciborowski - MSFT

1

การสร้างไฟล์อิสระเช่น ตัวอย่าง. java เพื่อใช้โซลูชันที่ 1 นั้นใช้ได้ คุณสามารถทำสิ่งนั้นได้ภายในแอพเช่นหากตัวแปรทั่วโลกเป็นพิเศษสำหรับแอปปัจจุบันของคุณ

สร้างคลาสที่จุดเริ่มต้นและประกาศตัวแปรของคุณในนั้น:

class Globals {
  static int month_number;
  static String month_name;
}

จากนั้นคุณสามารถเข้าถึงตัวแปรเหล่านี้ - ใช้พวกเขาเป็น 'Globals.month_number' ฯลฯ - จากทุกที่ในแอปของคุณ


แทนที่จะช่วยดาวน์คุณช่วยบอกฉันทีว่าโซลูชันนี้มีอะไรผิดปกติหรือไม่? ฉันใช้มันอย่างต่อเนื่องและสะดวกที่สุด ดังนั้นฉันจึงไม่สามารถทำอย่างอื่นได้หากพิจารณาจาก downvote นี้ว่าเป็นเรื่องส่วนตัวหรือทำโดยคนโง่
Apostolos

1

ถ้าคุณต้องการอัพเดตคุณสมบัติโกลบอลคลาส wrapper getter / setter ที่เรียบง่ายสามารถใช้เป็นตัวแปรโกลบอล ตัวอย่างทั่วไปแสดงไว้ด้านล่าง

public class GlobalHolder {

    private static final GlobalHolder INSTANCE = new GlobalHolder();

    private volatile int globalProperty;

    public static GlobalHolder getInstance() {
        return INSTANCE;
    }

    public int getGlobalProperty() {
        return globalProperty;
    }

    public void setGlobalProperty(int globalProperty) {
        this.globalProperty = globalProperty;
    }

    public static void main(String[] args) {
        GlobalHolder.getInstance().setGlobalProperty(10);
        System.out.println(GlobalHolder.getInstance().getGlobalProperty());
    }
}

0

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

public class Add {
    static int a;
    static int b; 
    static int c;

    public static void main(String arg[]) {
        c=sum();
        System.out.println("Sum is: "+c); 
    }

    static int sum() {
       a=20;
       b=30;
       return a+b;   
    }
}

Output: Sum is: 50

ยิ่งกว่านั้นการใช้คำสำคัญคงที่ก่อนตัวแปรอินสแตนซ์ทำให้เราไม่สามารถระบุประเภทข้อมูลสำหรับตัวแปรเดียวกันซ้ำแล้วซ้ำอีก เพียงเขียนตัวแปรโดยตรง


1
ไม่มีตัวแปรทั่วโลกใน Java; พวกเขายังไม่เป็นที่รู้จักกันในนามตัวแปรอินสแตนซ์; กำหนดพวกเขาเป็นstatic'ไม่ทำให้พวกเขาพร้อมใช้งานอย่างสมบูรณ์' วรรคแรกไร้สาระ ตัวอย่างคือการปฏิบัติที่ไม่ดี
มาร์ควิสแห่ง Lorne

0

โดยทั่วไปแล้ว Java ไม่มีตัวแปรทั่วโลก นอกเหนือจากตัวแปรโลคัลตัวแปรทั้งหมดจะอยู่ภายใต้ขอบเขตของคลาสใด ๆ ที่กำหนดไว้ในโปรแกรม เราสามารถมีตัวแปรสแตติกที่จะมีขอบเขตของตัวแปรทั่วโลก


0

หากไม่มีstaticสิ่งนี้ก็เป็นไปได้เช่นกัน:

class Main {
  String globalVar = "Global Value";

  class Class1 {
    Class1() {
      System.out.println("Class1: "+globalVar);
      globalVar += " - changed";
  } }
  class Class2 {
    Class2() {
      System.out.println("Class2: "+globalVar);
  } }

  public static void main(String[] args) {  
    Main m = new Main();
    m.mainCode();
  }
  void mainCode() {
    Class1 o1 = new Class1();
    Class2 o2 = new Class2();
  }
}

/*
Output:
Class1: Global Value
Class2: Global Value - changed
*/

0

การเขียนโปรแกรมเชิงวัตถุถูกสร้างขึ้นด้วยความเข้าใจว่าขอบเขตของตัวแปรนั้นมีความพิเศษอย่างใกล้ชิดกับวัตถุคลาสที่ห่อหุ้มตัวแปรเหล่านั้น

ปัญหาในการสร้าง "ตัวแปรทั่วโลก" คือไม่ใช่มาตรฐานอุตสาหกรรมสำหรับ Java ไม่ใช่มาตรฐานอุตสาหกรรมเนื่องจากอนุญาตให้หลายคลาสจัดการข้อมูลแบบอะซิงโครไนซ์ถ้าคุณใช้แอปพลิเคชันแบบมัลติเธรดสิ่งนี้จะซับซ้อนและเป็นอันตรายเล็กน้อยในแง่ของความปลอดภัยของเธรด มีเหตุผลอื่น ๆ อีกมากมายว่าทำไมการใช้ตัวแปรทั่วโลกจะไม่ได้ผล แต่ถ้าคุณต้องการที่จะหลีกเลี่ยงการที่ผมแนะนำให้คุณหันไปใช้การเขียนโปรแกรมเชิงลักษณะ

การเขียนโปรแกรมที่มุ่งเน้นเชิงลบล้างปัญหานี้โดยการใส่ชั้นผู้ปกครองในการดูแลขอบเขตผ่านสิ่งที่เรียกว่า "คำแนะนำ" ซึ่งเพิ่มพฤติกรรมเพิ่มเติมให้กับรหัสโดยไม่ต้องแก้ไขมันจริง มันนำเสนอโซลูชั่นเพื่อแก้ไขข้อกังวลข้ามหรือการใช้ตัวแปรทั่วโลก

Springเป็นเฟรมเวิร์ก Java ที่ใช้ AOP และในขณะที่มันถูกใช้แบบดั้งเดิมสำหรับเว็บแอ็พพลิเคชันแอปพลิเคชันหลักสามารถใช้ได้ทั่วทั้งกรอบ Java (รวม 8.0) นี่อาจเป็นทิศทางที่คุณต้องการสำรวจเพิ่มเติม


0

ทำความเข้าใจกับปัญหา

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

โดยปกติถ้าคุณมีคลาส A

public class A {
    private int myVar;

    public A(int myVar) {
        this.myVar = myVar;
    }

    public int getMyVar() {
        return myVar;
    }

    public void setMyVar(int mewVar) {
        this.myVar = newVar;
    }
}

และต้องการเข้าถึงและอัปเดตmyvarในคลาส B

public class B{

    private A a;

    public void passA(A a){
        this.a = a;
    }

    public void changeMyVar(int newVar){
        a.setMyvar(newVar);
    }
}

คุณจะต้องมีการอ้างอิงของอินสแตนซ์ของคลาส A และอัปเดตค่าในคลาส B เช่นนี้:

int initialValue = 2;
int newValue = 3;
A a = new A(initialValue);
B b = new B();
b.passA(a);
b.changeMyVar(newValue);
assertEquals(a.getMyVar(),newValue); // true

สารละลาย

ดังนั้นวิธีการแก้ปัญหาของฉันนี้ (แม้ว่าฉันไม่แน่ใจว่ามันเป็นวิธีปฏิบัติที่ดี) คือการใช้ซิงเกิล:


public class Globals {
    private static Globals globalsInstance = new Globals();

    public static Globals getInstance() {
        return globalsInstance;
    }

    private int myVar = 2;

    private Globals() {
    }

    public int getMyVar() {
        return myVar;
    }

    public void setMyVar(int myVar) {
        this.myVar = myVar;
    }
}

ตอนนี้คุณสามารถรับอินสแตนซ์ที่ไม่ซ้ำใครได้จากทุกที่ด้วย

Globals globals = Globals.getInstance();
// and read and write to myVar with the getter and setter like 
int myVar = globals.getMyVar();
global.setMyVar(3);

-1
// Get the access of global while retaining priveleges.
// You can access variables in one class from another, with provisions.
// The primitive must be protected or no modifier (seen in example).

// the first class
public class farm{

  int eggs; // an integer to be set by constructor
  fox afox; // declaration of a fox object

  // the constructor inits
  farm(){
    eggs = 4;
    afox = new fox(); // an instance of a fox object

    // show count of eggs before the fox arrives
    System.out.println("Count of eggs before: " + eggs);

    // call class fox, afox method, pass myFarm as a reference
    afox.stealEgg(this);

    // show the farm class, myFarm, primitive value
    System.out.println("Count of eggs after : " + eggs);

  } // end constructor

  public static void main(String[] args){

    // instance of a farm class object
    farm myFarm = new farm();

  }; // end main

} // end class

// the second class
public class fox{

  // theFarm is the myFarm object instance
  // any public, protected, or "no modifier" variable is accessible
  void stealEgg(farm theFarm){ --theFarm.eggs; }

} // end class

2
คำตอบนี้เพิ่มอะไรที่คำตอบอื่นไม่ได้? ฉันไม่เห็นค่า "ใหม่" ในคำตอบนี้
EWit

-2

เพื่อกำหนดตัวแปรส่วนกลางคุณสามารถใช้ประโยชน์จากคำหลักคงที่

public final class Tools {
  public static int a;
  public static int b;
}

ตอนนี้คุณสามารถเข้าถึง a และ b ได้จากทุกที่โดยการโทร

Tools.a;
Tools.b;

Yoy นั้นถูกต้อง ... เป็นพิเศษใน J2ME ... คุณสามารถหลีกเลี่ยง NullPointerException โดยใส่ตัวสร้าง MidLet ของคุณ (การเริ่มต้น proggy) บรรทัดของโค้ดนี้:

new Tools();

สิ่งนี้ทำให้มั่นใจได้ว่าเครื่องมือจะได้รับการจัดสรรก่อนคำสั่งใด ๆ ที่ใช้

แค่นั้นแหละ!


3
อืม ... ขออภัย แต่สิ่งที่เพิ่มนี้ที่ไม่ได้ครอบคลุมโดยคำตอบที่มีอยู่แล้ว?
Mysticial

บางทีคุณพูดถูก แต่คำตอบนี้อธิบายสิ่งต่าง ๆ เช่นการจัดสรรหน่วยความจำ
user2616742

ไม่มีคลาสระดับบนสุดแบบคงที่ใน java
Andremoniy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.