我有一堂课
Repo
,其定义如下:
class Repo
{
private final record Table(String name,List<String[]> columns){}
private static final Map<Integer,Table> TABLES = Map.ofEntries(
Map.entry(0, new Table("item 1", List.of(
new String[]{"A","B","C"},
new String[]{"AA","BB","CC"},
//... Long list of String[]
))),
Map.entry(1, new Table("item 2", List.of(
new String[]{"D","E","F"},
new String[]{"DD","EE","FF"},
//... Long list of String[]
))),
//... More entries
);
protected static String getTableName(int index)
{
return TABLES.get(index).name();
}
private static List<String[]> getColumns(int index)
{
return TABLES.get(index).columns();
}
protected static String initTables(int index)
{
var table = getTableName(index);
var columns = getColumns(index).append(",");
var builder = new StringBuilder(table).append(",")
for(var col: columns)
{
builder.append(col[0]).append(",").append(col[1]).append(",").append(col[2]);
}
return builder.toString();
}
}
我的问题是,
initTables
函数仅被另一种方法 connect()
调用一次,该方法本身驻留在一个类 Model
中,其范围遍及整个程序生命周期,而 getTableName
将被各种方法调用多次。由于 TABLES
和 initTables
是静态的,因此它们将在整个程序中保留在内存中。完成后有什么方法可以将它们从太空中移除吗?
我想为
TABLES
创建一个名为 TableColumns
的单独类,只有列,并在 initTables
中创建其实例:
class Repo
{
private static final Map<Integer,String> TableNames = Map.ofEntries(
Map.entry(0, "item 1"),
Map.entry(1, "item 2"),
//... more entries
);
protected String getTableName(int index)
{
return TABLES.get(index);
}
protected String initTables(int index)
{
var table = getTableName(index);
var builder = new StringBuilder(index).append(",");
var tablecolumns = new TableColumns().getColumns(index);
for(var col:tablecolumns)
{
...
}
return builder.toString();
}
}
TableColumns 类
public TableColumns
{
private static final Map<Integer,List<String[]>> TABLES = Map.ofEntries(
Map.entry(0, List.of(
new string[]{...},
//... more String[]
)),
//... more entries
);
public TableColumns(){}
protected List<String[]> getColumns(int index)
{
return TABLES.get(index);
}
}
这会优化内存使用还是有更好的方法来实现这一点?
按照 Thomas Klager 的建议,我将
item1
、item2
等条目转换为外部文本文件,并修改 initTables
如下:
protected String initTables(int index)
{
var tableName=getTableName(index);
try(var scanner=new Scanner(getClass().getResourceAsStream(tableName))
{
while(scanner.hasNextLine())
{
System.out.println(scanner.nextLine());
}
}
}