Variabel global di Jawa


217

Bagaimana Anda mendefinisikan variabel Global di Jawa?


20
Bisakah Anda memberi tahu kami mengapa Anda ingin mendefinisikan variabel global di Jawa?
Adam Paynter

44
Untuk mengakses variabel dari luar kelas
aTJ

5
Mungkin Anda harus mengedit pertanyaan Anda untuk memasukkan beberapa kode sampel yang menggambarkan dengan tepat apa yang Anda inginkan. Ini akan membantu kami merekomendasikan solusi terbaik.
Adam Paynter

7
@ Adam: Saya harus dapat mengubah nilai suatu variabel dalam satu kelas dari kelas lain.
aTJ

2
Kamu tidak. Tidak ada variabel global di Jawa.
Marquis of Lorne

Jawaban:


261

Untuk menentukan Variabel Global Anda dapat menggunakan Kata Kunci statis

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

sekarang Anda dapat mengakses a dan b dari mana saja dengan menelepon

Example.a;

Example.b;

6
"Global" adalah nama kelas.
Jerome

12
Hati-hati saat melakukan ini - ketika kelas Global diturunkan, variabel-variabelnya akan menjadi nol. Jika Anda menjual aplikasi Anda ini akan terjadi cepat atau lambat dan Anda terus mencari kesalahan di mana-mana tetapi tidak ada ....
user387184

10
Kata statickunci membuat variabel dapat diakses secara global, sementara kelas mereka dimuat.
sjas

22
Tentang pembongkaran kelas: jika ada rantai referensi yang kuat dari GC Root ke instance Global atau anak-anaknya, atau referensi waktu kompilasi dari kelas yang dimuat dan tidak-tidak dapat dibongkar ke Global, maka objek Kelas relatif ke Global sangat kuat dapat dijangkau, dan, oleh karena itu, begitu juga ClassLoader yang memuat Global; yang membuatnya tidak mungkin untuk membongkar Global (karena pembongkaran kelas hanya dapat terjadi setelah GC sepenuhnya menghapus referensi kuat apa pun ke ClassLoader yang memuat kelas tertentu). Jika Anda tidak memiliki referensi sama sekali, bagaimana mungkin pembongkaran menjadi masalah ???
Bruno Reis

4
@Abi Saya sarankan Anda mengubah nama kelas Anda dari Globalsesuatu yang lain ( TestClass?) Agar tidak memberi kesan pada orang bahwa ada yang namanya Globalkata kunci Java. Lebih baik aman daripada menyesal :)
Nicolas Rinaudo

53

Kamu tidak. Itu dengan desain. Anda seharusnya tidak melakukannya bahkan jika Anda bisa.

Yang sedang berkata Anda bisa membuat satu set anggota statis publik di kelas yang bernama Globals.

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

tetapi Anda benar-benar tidak boleh :). Serius .. jangan lakukan itu.


6
Lalu apa pendekatan yang lebih baik sehingga saya dapat mendeklarasikan konstanta sehingga semua metode kelas dapat mengaksesnya?
Alston

6
Tulisan seperti ini adalah alasan para pemula mengembangkan fobia variabel global, dan kemudian kita melihat semua jenis teknik mengerikan dirancang untuk menghindari tabu variabel global, tetapi mencapai efek yang sama.
Evgeni Sergeev

38
Turunkan suara untuk mengatakan, "jangan lakukan itu." tanpa menjelaskan atau merujuk pada penjelasan mengapa.
Jeff McCune

4
@JeffMcCune: untuk membuat pernyataan Anda lebih jelas, "jangan lakukan itu" sebenarnya omong kosong. Lakukan saat itu berguna. Sebagai contoh, saya harus men-debug kode saya menggunakan beberapa IAbstractLoggerBullshit dan tentu saja System.err tidak bekerja di lingkungan yang terlalu direkayasa ini. Saya tidak bisa membuang sampah sembarangan kode saya di sekitar logger omong kosong antara ratusan kelas adaptor tidak berguna.
Jo So

6
Saya akan melakukannya.
Floating Sunfish

40

Cara lain adalah dengan membuat antarmuka seperti ini:

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

Setiap kelas yang perlu menggunakannya hanya perlu mengimplementasikan antarmuka:

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

Saya bertanya-tanya mengapa jawaban ini (sebelum saya) tidak memiliki suara. Apakah itu tidak memberikan jawaban alternatif yang masuk akal untuk yang disediakan oleh semua jawaban lain?
M_M

12
Java Efektif oleh Joshua Bloch, Bab 4: Kelas dan Antarmuka, Butir 19: Gunakan antarmuka hanya untuk mendefinisikan tipe "Pola antarmuka konstan adalah penggunaan antarmuka yang buruk." Buku ini layak dibaca! :)
MariuszS

1
Selain itu dari JDK 1.5+ Anda dapat menggunakan impor statis untuk variabel global Anda, implementasi tidak diperlukan.
MariuszS

9
.... Benar, itu tidak benar-benar menjelaskan apa pun, itu hanya mengatakan bahwa beberapa buku mengatakan itu buruk.
linkhyrule5

14
Ini kutipan untuk Anda. Oracle mengatakan: "Untuk mengatasi ini, orang kadang-kadang menempatkan anggota statis ke dalam antarmuka dan mewarisi dari antarmuka itu. Ini adalah ide yang buruk. Bahkan, itu adalah ide yang buruk sehingga ada nama untuk itu: Konstan Antarmuka Antipattern (lihat Item Java Efektif 17). Masalahnya adalah bahwa penggunaan kelas dari anggota statis kelas lain hanyalah detail implementasi. Ketika kelas mengimplementasikan antarmuka, itu menjadi bagian dari API publik kelas. Rincian implementasi tidak boleh bocor ke API publik. "
Jolta

23

Anda lebih baik menggunakan injeksi ketergantungan:

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

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

5
Benar, meskipun saya pikir Anda menggunakan "Globals" sedikit membingungkan :-). Sesuatu seperti "Parameter" akan lebih pas karena belum tentu global.
Mark Peters

11

Banyak jawaban bagus, tetapi saya ingin memberikan contoh ini karena dianggap cara yang lebih tepat untuk mengakses variabel kelas dengan kelas lain: menggunakan getter dan setter.

Alasan mengapa Anda menggunakan getter dan setter dengan cara ini alih-alih hanya membuat variabel publik adalah sebagai berikut. Katakanlah var Anda akan menjadi parameter global yang Anda TIDAK PERNAH ingin seseorang berubah selama pelaksanaan program Anda (dalam kasus ketika Anda mengembangkan kode dengan tim), sesuatu seperti mungkin URL untuk situs web. Secara teori ini bisa berubah dan dapat digunakan berkali-kali dalam program Anda, jadi Anda ingin menggunakan var global untuk dapat memperbaruinya sekaligus. Tetapi Anda tidak ingin orang lain masuk dan mengubah var ini (mungkin tanpa menyadari betapa pentingnya itu). Dalam hal ini Anda sama sekali tidak menyertakan metode penyetel, dan hanya menyertakan metode pengambil.

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

Tidak ada variabel global di Jawa

Namun demikian, apa yang kami miliki adalah statickata kunci dan hanya itu yang kami butuhkan. Tidak ada yang ada di luar kelas di Jawa. Kata statickunci mewakili variabel kelas yang, berbeda dengan variabel instan, hanya memiliki satu salinan dan yang melampaui semua instance kelas yang dibuat, yang artinya nilainya dapat diubah dan diakses di semua instance pada titik mana pun.

Jika Anda memerlukan variabel global yang dapat diakses di luar cakupan, maka ini adalah variabel yang Anda butuhkan, tetapi ruang lingkupnya hanya ada di mana kelasnya, dan hanya itu saja.


9

Sebenarnya tidak ada konsep "GLOBAL" dalam program java OO

Namun demikian ada beberapa kebenaran di balik pertanyaan Anda karena akan ada beberapa kasus di mana Anda ingin menjalankan metode di bagian mana pun dari program ini. Misalnya --- metode acak () dalam aplikasi Phrase-O-Matic; itu adalah metode yang harus dapat dipanggil dari mana saja dari suatu program.

Jadi untuk memuaskan hal-hal seperti di atas, "Kita perlu memiliki variabel dan metode seperti global"

UNTUK MENYATAKAN VARIABEL SEBAGAI GLOBAL.

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

UNTUK MENYATAKAN METODE SEBAGAI GLOBAL .

 1. Mark the method as public static While declaring.

Karena saya menyatakan variabel global dan metode sebagai statis, Anda dapat memanggil mereka di mana saja yang Anda inginkan hanya dengan bantuan kode berikut

ClassName.X

CATATAN : X dapat berupa nama metode atau nama variabel sesuai persyaratan dan ClassName adalah nama kelas tempat Anda mendeklarasikannya.


9

Tidak ada yang global, kecuali konstanta.

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

Letakkan ini di dalam kelas utama Anda. Dalam file .java lainnya, gunakan melalui:

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

Pastikan ketika Anda memindahkan kode Anda dari lantai ruang pemotongan dan ke rilis Anda menghapus atau mengomentari fungsi ini.

Jika Anda memiliki metode kerja keras, seperti pengacak, saya sarankan untuk membuat paket "Toolbox"! Semua coders harus memilikinya, maka kapan pun Anda ingin menggunakannya dalam .java, cukup impor saja!


5

Tidak ada yang namanya variabel global di Jawa. Setiap variabel statis harus dimiliki oleh beberapa kelas (seperti System.out), tetapi ketika Anda telah memutuskan kelas mana yang akan masuk, Anda dapat merujuknya dari mana saja yang dimuat oleh classloader yang sama.

Perhatikan bahwa variabel statis harus selalu dilindungi saat memperbarui untuk menghindari kondisi balapan.


1
java tidak menyediakan variabel global secara fungsional tetapi jika Anda ingin memiliki konsep variabel global, kita dapat menggunakan kata kunci statis
Abi

3
public class GlobalClass {
     public static int x = 37;
     public static String s = "aaa";
}

Dengan cara ini Anda dapat mengaksesnya dengan GlobalClass.xdanGlobalClass.s


2
public class GlobalImpl {   

 public static int global = 5;

}

Anda dapat menelepon ke mana saja Anda inginkan:

GlobalImpl.global // 5

1

Seperti yang Anda tebak dari jawabannya, tidak ada variabel global di Jawa dan satu-satunya hal yang dapat Anda lakukan adalah membuat kelas dengan anggota statis:

public class Global {
    public static int a;
}

Anda bisa menggunakannya dengan di Global.atempat lain. Namun jika Anda menggunakan Java 1.5 atau lebih baik, Anda bisa menggunakan import staticsihir untuk membuatnya terlihat lebih sebagai variabel global nyata:

import static test.Global.*;

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

Dan voila !

Sekarang ini jauh dari praktik terbaik sehingga seperti yang Anda lihat di iklan: jangan lakukan ini di rumah


1

Tidak ada variabel global di Jawa, tetapi ada kelas global dengan bidang publik. Anda dapat menggunakan fitur impor statis java 5 agar terlihat hampir seperti variabel global.


1

Secara umum variabel Global (saya anggap Anda membandingkannya dengan C, Cpp) mendefinisikan sebagai public static final

Suka

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

ENUM juga berguna dalam skenario seperti itu:

Sebagai contoh Calendar.JANUARY)


Apakah variabel global harus final? Mengapa?
Konerak

1
"final" berarti "konstan", jadi ini adalah konstanta global.
duffymo

1
tidak, itulah yang dimaksud variabel Global jika Anda ingin membagikan variabel itu dan mengubah data juga maka hapus saja finaltetapi itu tentu saja tergantung pada bagaimana Anda ingin berbagi, di mana Anda menggunakan dan semuanya,
Jigar Joshi

Apa jenis CODEdalam contoh ini? Di mana itu didefinisikan?
M_M

Perhatikan juga: CODE ada di dalam semua huruf besar, sebagai notasi java umum untuk menggunakan semua huruf besar untuk variabel yang Anda nyatakan sebagai final, dan tidak bermaksud untuk berubah selama program berlangsung.
Dan Ciborowski - MSFT

1

Membuat file independen, mis. Contoh.java untuk menggunakan solusi 1, baik-baik saja. Anda dapat melakukannya juga di dalam aplikasi, jika misalnya variabel global khusus untuk aplikasi Anda saat ini, dll .:

Buat kelas di awal dan nyatakan variabel Anda di sana:

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

Anda kemudian dapat mengakses variabel-variabel ini - menggunakannya sebagai 'Globals.month_number', dll. - dari mana saja di aplikasi Anda.


Alih-alih downvoting, bisakah Anda memberi tahu saya apa yang salah dengan solusi ini? Saya menggunakannya secara konstan dan itu yang paling nyaman. Jadi saya tidak bisa melakukan sebaliknya menganggap ini sebagai masalah pribadi atau hanya dilakukan oleh orang bodoh.
Apostolos

1

Jika Anda perlu memperbarui properti global, kelas wrapper pengambil / penyetel sederhana dapat digunakan sebagai variabel global. Contoh khas ditunjukkan di bawah ini.

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

Going by the concept, variabel global, juga dikenal sebagai variabel instan adalah variabel level kelas, yaitu mereka didefinisikan di dalam kelas tetapi di luar metode. Untuk membuatnya tersedia sepenuhnya dan menggunakannya secara langsung, berikan kata kunci statis. Jadi jika saya menulis sebuah program untuk operasi aritmatika sederhana dan memerlukan pasangan angka maka dua variabel instan didefinisikan sebagai:

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

Selain itu menggunakan kata kunci statis sebelum variabel instan memungkinkan kita untuk tidak menentukan tipe data berulang kali. Cukup tulis variabel secara langsung.


1
Tidak ada variabel global di Jawa; mereka tidak juga dikenal sebagai variabel instan; mendefinisikannya sebagai statictidak 'membuatnya tersedia sepenuhnya'. Paragraf pertama adalah omong kosong. Contohnya adalah praktik yang buruk.
Marquis of Lorne

0

Secara umum, Java tidak memiliki variabel global. Selain variabel lokal, semua variabel berada di bawah lingkup kelas apa pun yang ditentukan dalam program. Kita dapat memiliki variabel statis untuk memiliki ruang lingkup variabel global.


0

tanpa staticini juga mungkin:

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

Pemrograman Berorientasi Objek dibangun dengan pemahaman bahwa ruang lingkup variabel sangat eksklusif untuk objek kelas yang merangkum variabel-variabel tersebut.

Masalah dengan membuat "variabel global" adalah bahwa itu bukan standar industri untuk Java. Ini bukan standar industri karena memungkinkan beberapa kelas untuk memanipulasi data yang disinkronkan, jika Anda menjalankan aplikasi multi-utas, ini menjadi sedikit lebih rumit dan berbahaya dalam hal keamanan utas. Ada berbagai alasan lain mengapa menggunakan variabel global tidak efektif, tetapi jika Anda ingin menghindarinya, saya sarankan Anda menggunakan Pemrograman Berorientasi Aspek .

Pemrograman Berorientasi Aspek meniadakan masalah ini dengan menempatkan kelas induk bertanggung jawab atas lingkup melalui sesuatu yang disebut "saran", yang menambahkan perilaku tambahan pada kode tanpa benar-benar memodifikasinya. Ini menawarkan solusi untuk masalah lintas sektoral, atau penggunaan variabel global.

Spring adalah kerangka kerja Java yang memanfaatkan AOP, dan meskipun secara tradisional digunakan untuk aplikasi web, aplikasi inti dapat digunakan secara universal di seluruh kerangka Java (termasuk 8,0). Ini mungkin arah yang ingin Anda jelajahi lebih jauh.


0

Memahami masalahnya

Saya menganggap kualifikasi variabel global sebagai variabel yang dapat diakses dan diubah di mana saja dalam kode tanpa peduli dengan panggilan statis / instance atau meneruskan referensi dari satu kelas ke kelas lain.

Biasanya jika Anda memiliki kelas 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;
    }
}

dan ingin mengakses dan memperbarui myvardi kelas B,

public class B{

    private A a;

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

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

Anda harus memiliki referensi turunan dari kelas A dan memperbarui nilai di kelas B seperti ini:

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

Larutan

Jadi solusi saya untuk ini, (bahkan jika saya tidak yakin apakah itu praktik yang baik), adalah menggunakan singleton:


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;
    }
}

Sekarang Anda bisa mendapatkan contoh unik Global di mana saja dengan:

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
Apa yang ditambahkan jawaban ini sehingga jawaban lain tidak? Saya tidak dapat melihat nilai "baru" dalam jawaban ini.
EWit

-2

Untuk menentukan Variabel Global Anda dapat menggunakan Kata Kunci statis

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

sekarang Anda dapat mengakses a dan b dari mana saja dengan menelepon

Tools.a;
Tools.b;

Yoy benar ... khususnya di J2ME ... Anda dapat menghindari NullPointerException dengan memasukkan ke dalam konstruktor MidLet Anda (inisialisasi proggy) baris kode ini:

new Tools();

Ini memastikan bahwa Alat akan dialokasikan sebelum instruksi yang menggunakannya.

Itu dia!


3
Mm ... Maaf, tapi apa yang ditambahkan ini yang belum tercakup oleh jawaban yang ada?
Mysticial

Mungkin Anda benar..tapi jawaban ini menjelaskan hal-hal seperti alokasi memori.
user2616742

Tidak ada kelas tingkat atas statis di java
Andremoniy
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.