【问题标题】:where to put constant used in a java class?java类中使用的常量放在哪里?
【发布时间】:2019-05-06 13:25:40
【问题描述】:

我想知道只在一个java类中使用的常量放在哪里?我的代码为共享内存创建了一个名称为 "sharedMemory" ,但我不确定是否应该放入单独的 Java 文件或只是在与 private static final String SHARED_MEMORY = "sharedMemory" 相同的类中定义。 我只在特定类中需要这个变量。另外,如果我在同一个类中定义,我应该将其设为静态吗?

class ABC{

private static final String SHARED_MEMORY = "sharedMemory"; // OK to define in same class or in separate constants file

   public void get(){
   String name;
    if(checIfSharedMemoryNeeded()){
      name  = SHARED_MEMORY;
    }
   }

   private boolen checIfSharedMemoryNeeded(){
     return (x.equals("yuiyr") && y.equals("yweir"))
   }
}

【问题讨论】:

  • 你只需要那个特定类的常量吗?如果是,它应该是私有的(原样),然后它将在正确的位置。
  • 你只在这个类中需要它,结果,它在哪里就可以了。
  • 是否有必要将其设为静态?
  • @Reena 必要,不,但它避免使用您不需要的系统资源。如果每个实例都必须相同,为什么要为每个实例创建变量?
  • @Reena Stultuske 的意思是:没必要,但更好,因为资源占用更少。

标签: java


【解决方案1】:

在该类的单个类中定义您只需要的常量,并将它们设为private。您可以确保它不会在其他任何地方意外使用。

private static final String ONLY_FOR_THIS_CLASS = "only here";

定义上下文绑定到特定类的常量,但在上下文绑定到的该类中的其他类中可能需要这些常量,但将它们设为public

public static final String CONTEXTUALLY_FOR_THIS_CLASS_BUT_USABLE_ANYWHERE = "everywhere";

它将允许在其他类中使用,例如

String constantValueFromOtherClass = OtherClass.CONTEXTUALLY_FOR_THIS_CLASS_BUT_USABLE_ANYWHERE;

如果您想到只包含公共常量的类的想法,请考虑编写enum。在很多情况下,enums 会是更好的解决方案。

【讨论】:

    【解决方案2】:

    对于做什么没有共同的指导方针。由于它只用在一个地方,我建议你把它留在使用它的课堂上。

    除非您想在将来更改该值并且您有许多其他硬编码的值要在以后更改,否则我建议您创建一个包含所有这些值的类 Config。

    【讨论】:

    • “除非你想在未来改变这个值”。这有什么关系?限制不在于它有什么价值,而在于它在哪里使用。
    • 在大型项目中,可能很难对所有这些类型的值进行概览。它们通常不会保持不变。考虑这种情况:你有一个游戏。 NPC 有硬编码的对话。特定的行将仅在代码中的一个地方使用,但其他行将在其他地方使用。如果它们都在不同的类中,则很难对所有对话框进行概览。此外,请考虑是否要支持不同的语言。然后你可以有一个 EnglishDialog 类和一个 FrenchDialog 类。
    • 要么保持相同的值,要么不是常量。
    • 编译时是常量,但代码总是可以改变的。
    • NPC 对话框是一个不好的例子,因为它不是常量的用例,而是某种消息源模式。
    【解决方案3】:

    如果这个常量只用于这个类,那么你应该声明是相同的类范围。

    现在您必须考虑将来是否要更改该值。如果这样做,并且您的应用程序可扩展,最好创建一个 .properties 文件来保存所有值并加载到您的应用程序。

    【讨论】:

      【解决方案4】:

      Java 中非全局常量的一般约定是用private static final 写成这样:

      class Foo {
          private static final String bar = "foobar";
      
          ...
      }
      

      【讨论】:

        【解决方案5】:

        如果你想在 ABC 类中使用这个变量 (SHARED_MEMORY),那么私有访问说明符是可以的,如果这个变量是你的类的一部分而不是对象,那么使用 static 是个好主意。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-05
          • 2021-12-18
          相关资源
          最近更新 更多