Java中的全局变量

aTJ*_*aTJ 202 java

如何在Java中定义全局变量?

Abi*_*Abi 248

要定义全局变量,您可以使用静态关键字

public class Example {
    public static int a;
    public static int b;
}
Run Code Online (Sandbox Code Playgroud)

现在你可以通过电话从任何地方访问a和b

Example.a;

Example.b;
Run Code Online (Sandbox Code Playgroud)

  • 关于类卸载:如果从任何GC Root到Global或其子节点的实例有任何强引用链,或者从已加载和不可卸载的类到Global的任何编译时引用,则相对于Global的Class对象强烈可达,因此加载Global的ClassLoader也是如此; 这使得无法卸载Global(因为类卸载只能在GC完全删除对加载给定类的ClassLoader的强引用之后).如果你根本没有参考,卸载怎么可能是一个问题? (21认同)
  • 这样做时要小心 - 当Global类被卸载时,变量将被定义为null.如果你出售你的应用程序,这迟早会发生,你一直在寻找错误,但不是那里.... (12认同)
  • `static`关键字使变量全局可访问,同时加载它们的类. (10认同)
  • "Global"是该类的名称. (6认同)
  • @Abi我建议你将你的类从`Global`重命名为其他东西(`TestClass`?),以免给人一种"Global"Java关键字这样的印象.比抱歉更安全:) (4认同)

Mih*_*der 54

你没有.这是设计的.即使你可以,也不应该这样做.

话虽如此,您可以在名为Globals的类中创建一组公共静态成员.

public class Globals {
   public static int globalInt = 0;
   ///
}
Run Code Online (Sandbox Code Playgroud)

但你真的不应该:).说真的..不要这样做.

  • 投票赞成说"不要这样做".没有解释或参考对原因的解释. (31认同)
  • 那么我可以声明常量的更好方法是什么,以便所有类方法都可以访问它们? (5认同)
  • 这种性质的帖子是新手开发全局变量恐惧症的原因,然后我们看到各种各种令人震惊的技术被设计为绕过全局变量禁忌,但实现相同的效果. (4认同)
  • @JeffMcCune:为了让你的陈述更清晰,"不要这样做"实际上是废话.当它有用时这样做.例如,我必须使用一些IAbstractLoggerBullshit调试我的代码,当然System.err在这个过度设计的环境中不起作用.我不能丢弃我的代码在数百个无用的适配器类之间传递记录器垃圾. (4认同)
  • 我要去做 (2认同)

Eva*_*que 39

另一种方法是创建一个这样的接口:

public interface GlobalConstants
{
  String name = "Chilly Billy";
  String address = "10 Chicken head Lane";
}
Run Code Online (Sandbox Code Playgroud)

任何需要使用它们的类都必须实现接口:

public class GlobalImpl implements GlobalConstants
{
  public GlobalImpl()
  {
     System.out.println(name);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这是给你的报价.Oracle说:"为了解决这个问题,人们有时会将静态成员放入一个接口并继承该接口.这是一个坏主意.事实上,它有一个名称是一个坏主意:Constant Interface Antipattern (参见Effective Java Item 17).问题是类使用另一个类的静态成员只是一个实现细节.当一个类实现一个接口时,它就成了该类的公共API的一部分.实现细节不应该泄漏到公共API." (14认同)
  • Joshua Bloch的有效Java,第4章:类和接口,第19项:仅使用接口来定义类型"常量接口模式是接口的不良使用".这本书值得一读!:) (12认同)
  • ......对,这实际上并没有解释任何事情,只是说有些书说它很糟糕. (9认同)

Pet*_*rey 23

你最好使用依赖注入:

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

public class UsesGlobals {
    private final Globals globals;
    public UsesGlobals(Globals globals) {
        this.globals = globals;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 没错,虽然我认为你对"Globals"的使用会让人感到困惑:-).像"参数"这样的东西会更合适,因为它不一定是全局的. (5认同)

Dan*_*SFT 11

很多很好的答案,但我想给出这个例子,因为它被认为是另一个类访问类变量的更合适的方法:使用getter和setter.

您以这种方式使用getter和setter而不仅仅是将变量设为public的原因如下.让我们说你的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;
    }
}
Run Code Online (Sandbox Code Playgroud)


JAV*_*AVA 9

实际上,Java OO程序中没有"GLOBAL"的概念

然而,你的问题背后有一些事实,因为在某些情况下你想要在程序的任何部分运行一个方法.例如--- Phrase-O-Matic app中的random()方法;它是一个应该可以从程序的任何地方调用的方法.

所以为了满足上面这样的事情"我们需要有类似全局的变量和方法"

宣布全球变量.

 1.Mark the variable as public static final While declaring.
Run Code Online (Sandbox Code Playgroud)

宣布一种全球化的方法.

 1. Mark the method as public static While declaring.
Run Code Online (Sandbox Code Playgroud)

因为我将全局变量和方法声明为静态,所以只需借助以下代码即可随意调用它们

ClassName.X

注意:根据要求,X可以是方法名称或变量名称,ClassName是您声明它们的类的名称.


小智 9

Java中没有全局变量

然而,我们所拥有的是static关键字,这就是我们所需要的.Java中的类外没有任何东西存在.的static关键字代表一个类变量,相反,实例变量,仅具有一个拷贝和整个创建的类,这意味着它的值可以在任何时候被改变和访问的所有实例的所有实例超越.

如果您需要一个可以在范围之外访问的全局变量,那么这是您需要的变量,但它的范围仅存在于类所在的位置,并且将是全部.


小智 8

除了常数之外,什么都不应该是全局的.

public class MyMainClass {
    public final static boolean DEBUGMODE=true;
}
Run Code Online (Sandbox Code Playgroud)

把它放在你的主类中.在其他.java文件中,使用它:

if(MyMainClass.DEBUGMODE) System.out.println("Some debugging info");
Run Code Online (Sandbox Code Playgroud)

确保当您将代码从裁剪房间移开并释放时,您可以删除或注释掉此功能.

如果你有一个主力方法,比如随机发生器,我建议创建一个"工具箱"包!所有编码器都应该有一个,然后每当你想在.java中使用它时,只需导入它!


Tho*_*sen 5

Java中没有真正的全局变量。每个静态变量都必须属于某个类(例如System.out),但是当您决定将其放入哪个类时,可以从同一类加载器加载的所有位置引用它。

请注意,在更新时应始终保护静态变量,以避免出现竞争情况。