访问C#和java(具有GC的语言)中的硬编码映射或数组等的最佳方式

本文关键字:映射 编码 数组 方式 最佳 java 具有 语言 GC 访问 | 更新日期: 2023-09-27 18:00:03

在具有垃圾收集器的编程语言中,访问硬编码变量和对象的最佳方式是什么。我有两个选择:

选项1:

class Hello {
    void retrieveData() {
       Map map = App.staticMap;
  }
}
public class App {
  public static Map map = new Map<>() {
      "a", "b",
      "b", "d",
   //hundreds of lines      
 }
}

选项2:

class Hello {
  void retrieveData() {
    //let assume App instance is declared when program is started.
     Map map = App.getInstance().dataMap;
  }
}
public class App {
 private static App instance; 
 Map dataMap = new Map() <> {
   //hundreds of lines
 }
 public static App getInstance() {
    return instance;
 }
}

由于垃圾收集器的原因,我找不到最好的办法。当我调用静态变量时,垃圾收集器可能在调用之前收集了它。我想同样的东西对实例对象也是有效的。在JAVA和C#中,哪种方法最好?还是有选择?

访问C#和java(具有GC的语言)中的硬编码映射或数组等的最佳方式

垃圾收集器不会收集静态引用-规则是,当任何活动线程都无法访问对象时,该对象就有资格进行垃圾收集。静态对象总是可以访问的,因此永远不应该收集它们:链接

对于您的示例,以下是一些良好的实践建议:

-不要直接访问字段,最好提供一个getter。这使您可以灵活地在以后更改实现。

-不要使用实例方法访问静态字段。这使得代码变得混乱、难以阅读。

-尽量避免对数据进行硬编码——你能使用属性文件来存储这些地图信息吗?然后,如果以后需要更改它,它将是可配置的。

-对于您的需求,这里可能有些过头了,但可能值得研究枚举单例模式,而不仅仅是一个静态字段。

如果你真的想硬编码,我的首选实现方式是

public class App {
  private static Map map = new Map<>() {
      "a", "b",
      "b", "d",
   //hundreds of lines      
 }
 public Map getMap(){
   return map;
 }
}