【问题标题】:Java: static variable declaration best practices [closed]Java:静态变量声明最佳实践
【发布时间】:2020-03-02 12:02:03
【问题描述】:

我开发了一个 Java 程序,其中包含在所有类中使用的某些静态变量。

现在,我想将这些变量存储在一个平台上,我可以引用来自任何类的调用,而不是一次又一次地声明它们。

我在互联网上进行了研究,发现了一些很好的解决方案,例如在接口中声明它们并在我的类中实现该接口。

另外,我可以编写一个单独的类并使用该类的对象调用这些变量。

谁能提出更好的解决方案?或者这两者之间哪个更好?请解释:)

【问题讨论】:

  • “我想将这些变量存储在一个平台上”你是什么意思?
  • 就像我想声明它们一次,这样我就不必在每个类中声明或初始化它
  • 你知道static变量是如何工作的吗?
  • 如果它们是 static 变量,则第二种解决方案不需要该类的 instance
  • 为什么不创建一个包含所有静态变量的类?

标签: java


【解决方案1】:

如果您指的是全局可变状态,这取决于您所说的“变量”是什么意思,您可能应该使用单例模式,或者更好的是,以消除全局可变状态的方式重新设计您的应用程序。 (封装)

如果您的所有静态变量都是最终的,或者实际上是最终的(例如在运行时从环境变量加载),那么将它们包装在一个类中(使用私有构造函数,因为您不希望能够创建只有静态成员的类)可能是最好的解决方案。

接口旨在描述行为而不是状态,因此除非您在其中描述了合同,否则将其作为接口似乎没有用,并且可能会导致未来的混乱。

【讨论】:

  • 令人印象深刻。我有一些变量的值将在类中分配,但我想在初始化时声明它们一次。它们不是最终的。那么我应该从上面遵循什么?
  • 如果它们不是最终的,您应该使用Singleton pattern,因为这可以让您对关键部分和并发进行一些控制。话虽如此,我真的不建议使用全局可变状态,因为它通常被认为是一种反模式。
【解决方案2】:

1:- 像这样创建一个枚举类,

    public enum YourClassName{

 // these are your three varible
VARIABLE1("val1"), VARIABLE2("val2"), VARIABLE3("val3"),;

private String value;

YourClassName(String value) {
    this.value=value;
}

public String getValue() {
    return value;
}

public void setValue(String value) {
    this.value = value;
}

}

2:- 一旦你有一个带有一些变量的枚举类,那么你就可以像这样从每个类中调用,

 YourClassName.VARBIABLE1.getValue();

这会对你有所帮助,我认为这是一个好方法。

【讨论】:

  • 它会变得更复杂,我使用 public static String VARIABLE 只是想调用这个变量。setter 和 getter 会使其更复杂
  • 注意 java 命名约定。类名应以大写字符开头。像你的 varable1 这样的枚举值应该是大写的
【解决方案3】:

可以引用来自任何类的静态变量...(假设它们不是private):只需执行ClassName.variable

更好的 选项是不使用静态变量作为全局变量。使用 getter 和 setter 传递值。

接口解决方案很老套,我以前用过——但这也不理想。实现常量接口被认为是不好的做法。

【讨论】:

  • 实现一个常量接口是什么意思,因为你不必实现那个接口来访问那些静态变量,只是问我清楚
  • 那么我应该在哪里声明它们?我应该为常量创建一个新类并在那里声明我的变量吗?
  • @DevX 不,你不必这样做,但这就是 OP 正在尝试的(“在接口中声明它们并在我的类中实现该接口”)
  • @DevX 我以为 OP 说的是stackoverflow.com/questions/320588/…
  • @sleepToken 是的,这就是我的想法,但不确定他为什么要实现它,因为在大多数情况下,我们有一个单独的常量接口,并且几乎没有实现它们
【解决方案4】:

为了进一步研究 @sleepToken answer,您可以通过多种方式来完成您的工作。同样,这些方法可能取决于设计,有时可能与您正在处理的代码库中遵循的完全不同。

例如,在大多数情况下,我看到了一个约定,即常量是在 java 的接口中定义的,而该接口几乎从未实现过。您也可以拥有多个这样的接口。就像一个用于存储与用户相关的常量的接口,也可能是另一个用于存储与系统相关的常量的接口

  • IUserConstants.java
  • ISystemConstants.java

现在这完全取决于您来决定这些接口的名称和内容。由于这些是常量,您将在其中定义它们应该是公共的和静态的,有时您也会使它们成为最终的,但请确保您知道运行时和compile time constants 之间的区别。同样,这是您必须决定的事情。 此外,更多的 public static final 对于接口是多余的。这个link 刚刚引起了我的注意。

您可以查看此示例界面

public interface IConstants{
public static final int TIME=10; 
public static final String CONFIG_STRING=SomeClass.LoadValue(); 
}

我看到的另一种方法是使用包含所有静态和公共常量的抽象类,如果您想确保它不会进一步用于实现,您可以使用私有构造函数,尽管我不确定为什么要使用它,因为有时前面的遗留代码几乎没有意义。

public abstract class IConstants
{

  public static final int TIME = 10;
  public static final String CONFIG_STRING = SomeClass.LoadValue();constant

  private IConstants()
  {
    throw new AssertionError();
  }
}

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多