Java最佳实践静态最终映射值

时间:2019-05-28 09:32:32

标签: java optimization

我有一个实用程序类,其中包含带有某些值的静态最终映射。我需要在另一个课程中访问此地图。我应该只将地图声明为公共地图,还是应该在实用工具类中编写吸气剂,从而让地图成为私有地图?

两种方法都可行,但是最佳实践是什么?

public MyUtilityClass {
  public static final Map<String, Integer> MAX_LENGTHS = ImmutableMap.of(
      "title", 256,
      "text", 512);

}

public MyAnotherClass {

  public void someMethod() {
    //accessing the map directly
    MAX_LENGTHS.get("title")
  }

}

public MyUtilityClass {
  private static final Map<String, Integer> MAX_LENGTHS = ImmutableMap.of(
      "title", 256,
      "text", 512);

  public static final getMaxLengthMap() {return MAX_LENGTHS;}
}

public MyAnotherClass {
  public void someMethod() {
    //accessing the map directly
    getMaxLengthMap().get("title")
  }
}

好吧,实际上键是枚举值。 像

private static final Map<String, Integer> MAX_LENGTHS = ImmutableMap.of(
      MyEnumClass.TITLE, 256,
      MyEnumClass.TEXT, 512);

5 个答案:

答案 0 :(得分:5)

吸气剂没有添加任何东西-我只是将其公开。

有意义的是有一个直接返回值的方法:

public MyUtilityClass {
  private static final Map<String, Integer> MAX_LENGTHS = ImmutableMap.of(
      "title", 256,
      "text", 512);

  public static final getMaxLength(String item) {return MAX_LENGTHS.get(item);}
}

public MyAnotherClass {
  public void someMethod() {
    //accessing the map directly
    getMaxLength("title");
  }
}

这也使您以后可以轻松修改基础实现。例如,您可以为地图中未包含的项目返回默认值。

答案 1 :(得分:4)

您正在使用ImmutableMap项目中的guava;因此, true 不变的Map

制作public不会伤害任何人-因为没有人能以任何方式真正改变Map

答案 2 :(得分:2)

我不得不说,首先使用Enum可能会更好。由于此映射似乎总是完全静态的:

public enum MaxLength {
    TITLE(256),
    TEXT(512);

    public final int value;

    MaxLength(int value) {
        this.value= value;
    }
}

不再需要该实用工具类,您现在可以直接获取值:

int length = MaxLength.TITLE.value;

答案 3 :(得分:0)

这取决于您需要对地图执行的操作。 允许直接访问地图(将其设置为公开),将使任何人都可以不受限制地使用和修改该地图。

在您的情况下,地图是最终的且不可变,因此这将不适用。

但是,如果您只想限制对该内容的访问,例如title,那么正确的选择是创建一个只返回String的方法。

将地图设置为公共地图,或创建一个返回整个地图的方法都没有区别。

答案 4 :(得分:0)

我认为将吸气剂添加到所属类中是可行的方法。

public MyUtilityClass {
  private static final Map<String, Integer> MAX_LENGTHS = ImmutableMap.of(
      "title", 256,
      "text", 512);

  public static int getLength(final String key) {
     return MAX_LENGTHS.get(key);
  }
}

public MyAnotherClass {
  public void someMethod() {

    int x= MyUtilityClass.getLength("title")
  }
}

这使MyAnotherClass无需了解getter的任何实现细节,并使模拟测试变得更加容易。

相关问题