Java 创建内存高效静态方法的更好方法

问题描述 投票:0回答:1

我有一堂课

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);
    }
}

这会优化内存使用还是有更好的方法来实现这一点?

java class static
1个回答
0
投票

按照 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());
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.