Bagaimana Anda mendefinisikan variabel Global di Jawa?
Bagaimana Anda mendefinisikan variabel Global di Jawa?
Jawaban:
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;
statickunci membuat variabel dapat diakses secara global, sementara kelas mereka dimuat.
Globalsesuatu yang lain ( TestClass?) Agar tidak memberi kesan pada orang bahwa ada yang namanya Globalkata kunci Java. Lebih baik aman daripada menyesal :)
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.
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);
}
}
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;
}
}
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;
}
}
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.
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.
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!
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.
public class GlobalClass {
public static int x = 37;
public static String s = "aaa";
}
Dengan cara ini Anda dapat mengaksesnya dengan GlobalClass.xdanGlobalClass.s
public class GlobalImpl {
public static int global = 5;
}
Anda dapat menelepon ke mana saja Anda inginkan:
GlobalImpl.global // 5
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
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.
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)
finaltetapi itu tentu saja tergantung pada bagaimana Anda ingin berbagi, di mana Anda menggunakan dan semuanya,
CODEdalam contoh ini? Di mana itu didefinisikan?
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.
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());
}
}
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.
statictidak 'membuatnya tersedia sepenuhnya'. Paragraf pertama adalah omong kosong. Contohnya adalah praktik yang buruk.
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
*/
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.
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
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);
// 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
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!