访问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#中,哪种方法最好?还是有选择?
垃圾收集器不会收集静态引用-规则是,当任何活动线程都无法访问对象时,该对象就有资格进行垃圾收集。静态对象总是可以访问的,因此永远不应该收集它们:链接
对于您的示例,以下是一些良好的实践建议:
-不要直接访问字段,最好提供一个getter。这使您可以灵活地在以后更改实现。
-不要使用实例方法访问静态字段。这使得代码变得混乱、难以阅读。
-尽量避免对数据进行硬编码——你能使用属性文件来存储这些地图信息吗?然后,如果以后需要更改它,它将是可配置的。
-对于您的需求,这里可能有些过头了,但可能值得研究枚举单例模式,而不仅仅是一个静态字段。
如果你真的想硬编码,我的首选实现方式是
public class App {
private static Map map = new Map<>() {
"a", "b",
"b", "d",
//hundreds of lines
}
public Map getMap(){
return map;
}
}