Java 글로벌 변수
Java에서는 글로벌 변수를 어떻게 정의합니까?
글로벌 변수를 정의하려면 static 키워드를 사용합니다.
public class Example {
public static int a;
public static int b;
}
이제 A와 B에 전화하면 어디서든 접속할 수 있게 되었습니다.
Example.a;
Example.b;
넌 아냐.그것은 고의로 만들어졌다.할 수 있어도 하면 안 돼요.
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;
}
}
좋은 답변이 많지만, 이 예는 다른 클래스에서 getters와 setters를 사용하여 클래스의 변수에 액세스하는 보다 적절한 방법이라고 생각되기 때문에 제시하겠습니다.
변수를 공개하는 대신 getter와 setter를 사용하는 이유는 다음과 같습니다.예를 들어, var가 프로그램 실행 중(팀과 함께 코드를 개발하는 경우)에 절대 변경하지 않는 글로벌 파라미터가 된다고 가정해 봅시다.웹 사이트의 URL과 같습니다.이론적으로 이것은 변경될 수 있고 프로그램에서 여러 번 사용될 수 있으므로 글로벌 변수를 사용하여 한 번에 업데이트할 수 있습니다.그러나 다른 사용자가 이 변수를 변경하는 것은 원치 않습니다(아마도 이것이 얼마나 중요한지 모르고).이 경우 단순히 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;
}
}
사실 자바 OO 프로그램에는 'GLOBAL'이라는 개념이 없습니다.
그러나 프로그램의 어느 부분에서든 메서드를 실행하려는 경우가 있기 때문에 질문의 이면에는 몇 가지 진실이 있습니다.예를 들어 Phrase-O-Matic 앱의 ---random() 메서드는 프로그램 어디에서나 호출할 수 있는 메서드입니다.
그래서 위와 같은 것을 만족시키기 위해서는 글로벌한 변수와 방법이 필요하다.
변수를 글로벌로 선언하려면
1.Mark the variable as public static final While declaring.
Method를 Global로 선언합니다.
1. Mark the method as public static While declaring.
글로벌 변수와 메서드를 static으로 선언했기 때문에 다음 코드만으로 원하는 곳 어디든 호출할 수 있습니다.
ClassName(클래스명)x
메모: X는 요건에 따라 메서드 이름 또는 변수 이름 중 하나이며 ClassName은 선언한 클래스의 이름입니다.
Java에 전역 변수가 없습니다.
지금 있는 은 럼에 never, never never never never never never never 。static
키워드만 있으면 됩니다.Java ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」static
키워드는 인스턴스 변수와 달리 복사본이1개밖에 없는 클래스 변수를 나타냅니다.즉, 생성된 클래스의 모든 인스턴스에서 해당 값을 변경하여 임의의 시점에서 모든 인스턴스에서 액세스할 수 있습니다.
범위를 넘어 액세스할 수 있는 글로벌 변수가 필요한 경우 필요한 변수는 이 변수이지만 해당 범위는 클래스가 있는 위치에만 존재합니다.이것이 전부입니다.
상수를 제외하고 어떤 것도 글로벌하지 않아야 합니다.
public class MyMainClass {
public final static boolean DEBUGMODE=true;
}
이것을 당신의 메인 클래스에 넣으세요.다른 .java 파일에서는 다음을 통해 사용합니다.
if(MyMainClass.DEBUGMODE) System.out.println("Some debugging info");
코드를 절단실 바닥에서 분리하여 분리할 때 이 기능을 제거하거나 주석을 달아 주십시오.
랜덤라이저와 같은 가공의 방법이 있다면, 「툴박스」패키지를 만드는 것을 추천합니다!모든 코더는 1개를 가지고 있어야 합니다.그러면 .java에서 사용하고 싶을 때는 Import하기만 하면 됩니다.
Java에는 진정한 글로벌 변수가 없습니다.모든 정적 변수는 특정 클래스(System.out 등)에 속해야 하지만 어떤 클래스로 들어갈지 결정하면 동일한 클래스 로더가 로드하는 모든 위치에서 참조할 수 있습니다.
정적 변수는 경주 조건을 피하기 위해 업데이트할 때 항상 보호되어야 합니다.
문제의 이해
글로벌 변수의 수식이란 정적/인스턴스 호출이나 클래스 간에 참조를 전달하지 않고 코드 내 어디에서나 액세스하여 변경할 수 있는 변수라고 생각합니다.
보통 클래스 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 B, B-I-I-I-I-I-I-I-I-I-I-I로
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);
public class GlobalClass {
public static int x = 37;
public static String s = "aaa";
}
에서는, 「」를 할 수.GlobalClass.x
★★★★★★★★★★★★★★★★★」GlobalClass.s
글로벌 속성을 업데이트해야 할 경우 단순 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());
}
}
public class GlobalImpl {
public static int global = 5;
}
원하는 곳에 전화를 걸 수 있습니다.
GlobalImpl.global // 5
독립 파일 생성(예:첫 번째 솔루션을 사용하기 위해서는 example.java가 좋습니다.예를 들어 글로벌 변수가 현재 앱에 특별한 경우 등 앱 내에서 이 작업을 수행할 수 있습니다.
처음에 클래스를 만들고 변수를 선언합니다.
class Globals {
static int month_number;
static String month_name;
}
그런 다음 앱의 어디에서나 'Globals.month_number' 등으로 사용하여 이러한 변수에 액세스할 수 있습니다.
매우 심플:
class UseOfGlobal
{
private static int a;
private static int b;
}
가능한 경우 메서드 블록 내에 로컬 변수를 정의하는 것이 좋습니다.
답변에서 짐작할 수 있듯이 Java에는 글로벌 변수가 없으며 스태틱멤버로 클래스를 만드는 것밖에 할 수 없습니다.
public class Global {
public static int a;
}
쓸 수 있어요.Global.a
1.5 을 사용하는 에는 Java 1.5를 사용할 수 .import static
「 」 「 」 、 「 」 、 「 」
import static test.Global.*;
public class UseGlobal {
public void foo() {
int i = a;
}
}
그리고!
광고에서 보듯이 이것은 베스트 프랙티스와는 거리가 멀어요.집에서는 하지 마세요.
Java에는 글로벌 변수가 없지만 퍼블릭필드를 가진 글로벌클래스가 있어요.Java 5의 정적 Import 기능을 사용하여 글로벌 변수와 거의 비슷하게 만들 수 있습니다.
변수는 C, Cpp로 됩니다.public static final
맘에 들다
class GlobalConstant{
public static final String CODE = "cd";
}
ENUM은 이러한 시나리오에서도 도움이 됩니다.
예)
다른 클래스의 정적 멤버에 대한 정규화되지 않은 액세스를 허용하려면 정적 Import를 수행할 수도 있습니다.
import static my.package.GlobalConstants;
★★★★★★★★★★★★★★★★★★★★ print(GlobalConstants.MY_PASSWORD);
할 수 .print(MY_PASSWORD);
자세한 내용은 "import" 뒤에 있는 "static" 수식자가 의미하는 바를 참조하십시오.
상수를 운반하는 인터페이스에 대한 Evan Levesque의 답변을 생각해 보십시오.
// 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
개념에 따라 인스턴스 변수라고도 하는 전역 변수는 클래스 수준 변수입니다. 즉, 클래스 내부에서는 정의되지만 메서드 외부에서는 정의됩니다.이들을 완전히 사용할 수 있도록 하고 직접 사용하기 위해 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 키워드를 사용하면 동일한 변수의 데이터 유형을 여러 번 지정할 수 없습니다.변수를 직접 작성하기만 하면 됩니다.
일반적으로 Java에는 글로벌 변수가 없습니다.로컬 변수를 제외한 모든 변수는 프로그램에서 정의된 모든 클래스의 범위에 포함됩니다.정적 변수를 사용하여 글로벌 변수의 범위를 지정할 수 있습니다.
없이.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을 사용하는 것이 좋습니다.
Aspect-Oriented Programming은 부모 클래스가 스코프를 담당하게 함으로써 이 문제를 부정합니다.이러한 어드바이스는 실제로 수정하지 않고 코드에 동작을 추가합니다.이 솔루션은 교차 우려 사항, 즉 글로벌 변수 사용에 대한 솔루션을 제공합니다.
Spring은 AOP를 사용하는 Java 프레임워크로, 기존에는 웹 어플리케이션에서 사용되었지만 핵심 어플리케이션은 Java 프레임워크 전체에서 보편적으로 사용할 수 있습니다(포함 8.0).이 방향은 더 자세히 알아보고 싶은 방향일 수 있습니다.
글로벌 변수를 정의하려면 static 키워드를 사용합니다.
public final class Tools {
public static int a;
public static int b;
}
이제 A와 B에 전화하면 어디서든 접속할 수 있게 되었습니다.
Tools.a;
Tools.b;
네 말이 맞아...특히 J2ME에서는...Null Pointer를 피할 수 있습니다.MidLet 컨스트럭터(프로그 초기화)에 다음 코드 행을 넣는 예외:
new Tools();
이렇게 하면 도구를 사용하는 지시 전에 도구가 할당됩니다.
바로 그거야!
언급URL : https://stackoverflow.com/questions/4646577/global-variables-in-java
'programing' 카테고리의 다른 글
Java 8 속성별 구별 (0) | 2022.07.08 |
---|---|
Vue2.js - 오브젝트 내의 메서드를 호출하여 콜백합니다(이 문제). (0) | 2022.07.08 |
Java에서 스레드를 종료하려면 어떻게 해야 합니까? (0) | 2022.07.08 |
Vuex는 API 오류 알림을 처리하는 방법을 알려 주시겠습니까? (0) | 2022.07.08 |
Vuex에서 서로 변환하지 않고 동일한 개체를 두 변수로 복사하려면 어떻게 해야 합니까? (0) | 2022.07.08 |