Java에서 전역 변수를 어떻게 정의합니까?
Java에서 전역 변수를 어떻게 정의합니까?
답변:
전역 변수를 정의하기 위해 정적 키워드를 사용할 수 있습니다
public class Example {
public static int a;
public static int b;
}
지금 당신은 전화로 어디서나 a와 b에 액세스 할 수 있습니다
Example.a;
Example.b;
static자신의 클래스가로드되는 동안 키워드, 변수는 전역 적으로 액세스 할 수 있습니다.
Global을 다른 ( TestClass?)로 바꾸는 것이 좋습니다 Global. 죄송합니다보다 안전합니다 :)
당신은하지 않습니다. 의도적으로 설계된 것입니다. 할 수 있어도하지 말아야합니다.
즉, Globals라는 클래스에 공개 정적 멤버 세트를 작성할 수 있다고합니다.
public class Globals {
public static int globalInt = 0;
///
}
그러나 당신은 정말로해서는 안됩니다 :). 진심으로 ..하지 마십시오.
다른 방법은 다음과 같은 인터페이스를 만드는 것입니다.
public interface GlobalConstants
{
String name = "Chilly Billy";
String address = "10 Chicken head Lane";
}
그것들을 사용해야하는 모든 클래스는 인터페이스를 구현해야합니다.
public class GlobalImpl implements GlobalConstants
{
public GlobalImpl()
{
System.out.println(name);
}
}
의존성 주입을 사용하는 것이 좋습니다.
public class Globals {
public int a;
public int b;
}
public class UsesGlobals {
private final Globals globals;
public UsesGlobals(Globals globals) {
this.globals = globals;
}
}
좋은 대답이 많이 있지만 다른 클래스가 클래스의 변수에 액세스하는 더 적절한 방법 인 getter 및 setter를 사용하는 것으로 간주 되므로이 예제를 제공하고 싶습니다.
변수를 공용으로 만드는 대신 게터와 세터를 사용하는 이유는 다음과 같습니다. var가 전역 매개 변수가되어 프로그램을 실행하는 동안 (팀과 코드를 개발하는 경우) 누군가 웹 사이트의 URL과 같이 변경하지 않기를 바랍니다. 이론적으로 이것은 변경 될 수 있으며 프로그램에서 여러 번 사용될 수 있으므로 전역 변수를 사용하여 한 번에 모두 업데이트 할 수 있기를 원합니다. 그러나 다른 누군가가 들어가서이 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;
}
}
Java에는 전역 변수가 없습니다
그럼에도 불구하고 우리가 가진 것은 static키워드이며 우리가 필요한 전부입니다. Java에서는 클래스 외부에 존재하는 것이 없습니다. 그만큼static키워드는 인스턴스 변수는 반대로, 하나의 복사본 만 그 값이 어느 시점에서 모든 인스턴스에 변경 및 액세스 할 수 있음을 의미 만든 그 클래스의 모든 인스턴스에 걸쳐 그 초월을 가지고있는 클래스 변수를 나타냅니다.
범위를 넘어 액세스 할 수있는 전역 변수가 필요한 경우 필요한 변수이지만 범위는 클래스가있는 위치에만 존재하며 이것이 전부입니다.
실제로 Java OO 프로그램 에는 "GLOBAL" 이라는 개념이 없다
그럼에도 불구하고 프로그램의 어느 부분에서나 메소드를 실행하려는 경우가 있기 때문에 질문 뒤에 약간의 진실이 있습니다. 예를 들어 Phrase-O-Matic 앱의 --random () 메소드는 프로그램의 어느 곳에서나 호출 할 수있는 메소드입니다.
위와 같은 것을 만족시키기 위해서는 "전역과 같은 변수와 방법이 필요합니다"
글로벌 변수로 선언합니다.
1.Mark the variable as public static final While declaring.
글로벌 한 방법을 선언 합니다.
1. Mark the method as public static While declaring.
전역 변수와 메소드를 정적으로 선언했기 때문에 다음 코드를 사용하여 원하는 곳 어디에서나 호출 할 수 있습니다
ClassName.X
참고 : X는 요구 사항에 따라 메서드 이름 또는 변수 이름이 될 수 있으며 ClassName은 선언 한 클래스의 이름입니다.
상수를 제외하고는 전역이 될 수 없습니다.
public class MyMainClass {
public final static boolean DEBUGMODE=true;
}
이것을 메인 클래스에 넣으십시오. 다른 .java 파일에서는 다음을 통해 사용하십시오.
if(MyMainClass.DEBUGMODE) System.out.println("Some debugging info");
절단 실 바닥에서 코드를 옮길 때 릴리스 할 때이 기능을 제거하거나 주석 처리하십시오.
randomizer와 같은 주요 방법이 있다면 "Toolbox"패키지를 만드는 것이 좋습니다! 모든 코더에는 하나가 있어야하며, .java에서 사용할 때마다 가져 오십시오!
Java에는 진정한 전역 변수와 같은 것은 없습니다. 모든 정적 변수는 System.out과 같은 일부 클래스에 속해야하지만 어떤 클래스로 들어갈 지 결정하면 동일한 클래스 로더가로드 한 모든 곳에서 변수를 참조 할 수 있습니다.
경쟁 조건을 피하기 위해 업데이트 할 때는 정적 변수를 항상 보호해야합니다.
public class GlobalImpl {
public static int global = 5;
}
원하는 곳 어디든 전화 할 수 있습니다.
GlobalImpl.global // 5
아마도 대답에서 짐작할 수 있듯이 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;
}
}
그리고 il !
이제는 광고에서 볼 수 있듯이 모범 사례와는 거리가 멀 습니다. 집에서하지 마십시오.
일반적으로 전역 변수 (C, Cpp와 비교한다고 가정)는 다음과 같이 정의합니다. public static final
처럼
class GlobalConstant{
public static final String CODE = "cd";
}
ENUM은 다음과 같은 시나리오에서도 유용합니다.
예를 들어 Calendar.JANUARY)
final하지만 확실히 공유하려는 방법, 사용하는 위치 및 모두
CODE이 예에서 유형은 무엇입니까 ? 어디에 정의되어 있습니까?
독립 파일 작성 (예 : 첫 번째 솔루션을 사용하는 Example.java는 괜찮습니다. 전역 변수가 현재 앱에 특수한 경우 등 앱 내에서도이를 수행 할 수 있습니다.
처음에 클래스를 만들고 거기에 변수를 선언하십시오.
class Globals {
static int month_number;
static String month_name;
}
그런 다음 앱 어디에서나 'Globals.month_number'등으로 변수에 액세스 할 수 있습니다.
전역 속성을 업데이트해야하는 경우 간단한 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());
}
}
개념에 따라 인스턴스 변수라고도하는 전역 변수는 클래스 수준 변수입니다. 즉, 클래스 내부에서는 정의되지만 메서드 외부에서는 정의됩니다. 그것들을 완전히 사용 가능하게하고 그것들을 직접 사용하려면 static 키워드를 제공하십시오. 따라서 간단한 산술 연산을 위해 프로그램을 작성하고 숫자 쌍이 필요한 경우 두 개의 인스턴스 변수가 다음과 같이 정의됩니다.
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
또한 인스턴스 변수 앞에 정적 키워드를 사용하면 동일한 변수에 대한 데이터 유형을 반복해서 지정할 수 없습니다. 변수를 직접 작성하십시오.
static'완전히 이용 가능하게'하지 않는 것으로 정의하십시오 . 첫 번째 단락은 말이되지 않습니다. 실례는 좋지 않습니다.
이것 없이도 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
*/
객체 지향 프로그래밍 은 변수의 범위가 해당 변수를 캡슐화하는 클래스 객체와 밀접하게 배타적이라는 이해를 바탕으로 구축되었습니다.
"전역 변수"를 생성 할 때의 문제점은 Java의 산업 표준이 아니라는 것입니다. 다중 스레드 응용 프로그램을 실행하는 경우 여러 클래스가 비 동기화 된 데이터를 조작 할 수 있기 때문에 업계 표준이 아닙니다. 스레드 안전성 측면에서 좀 더 복잡하고 위험합니다. 가 있습니다 여러 가지 다른 이유로 사용하여 전역 변수가 비효율적 인 이유는,하지만 당신은이를 방지하려면, 난 당신에 의존 제안 가로 지향 프로그래밍 .
Aspect-Oriented Programming 은 "advices"라는 것을 통해 스코프를 담당하는 상위 클래스를 배치함으로써이 문제를 무효화합니다.이 클래스는 실제로 코드를 수정하지 않고 추가 동작을 추가합니다. 교차 절단 문제 또는 전역 변수 사용에 대한 솔루션을 제공합니다.
Spring 은 AOP를 사용하는 Java 프레임 워크이며 전통적으로 웹 애플리케이션에 사용되지만 핵심 애플리케이션은 Java 프레임 워크 (8.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);
// 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
전역 변수를 정의하기 위해 정적 키워드를 사용할 수 있습니다
public final class Tools {
public static int a;
public static int b;
}
지금 당신은 전화로 어디서나 a와 b에 액세스 할 수 있습니다
Tools.a;
Tools.b;
Yoy 맞습니다 ... 특히 J2ME에서 ...이 코드 줄에 MidLet 생성자 (프로기 초기화)를 넣음으로써 NullPointerException을 피할 수 있습니다.
new Tools();
이렇게하면 도구를 사용하는 명령 전에 도구가 할당됩니다.
그게 다야!