当前,我在应用程序中具有以下设计,该设计使用enum作为内存有效常量

public enum Board {
    Toronto    // Toronto stock Exchange
}

public class Stock {
    private final Board board;
    private final Code code;
    ....
}


这是一种内存有效的方式。同样,如果在证券交易所中有成千上万个Stock,则将仅创建1个Board实例。

Stock stock0 = new Stock(Code.newInstance("AAA.TO"), Board.Toronto);
Stock stock1 = new Stock(Code.newInstance("AAB.TO"), Board.Toronto);


但是,这当然有一些缺点。证券交易所会不时推出新的董事会。发生此类事件时,我需要


在枚举Board中添加新成员
编译应用程序并将其重新部署给用户




public enum Board {
    Toronto,   // Toronto stock Exchange
    TSXV       // New Toronto venture
}

Stock stock0 = new Stock(Code.newInstance("AAA.TO"), Board.Toronto);
Stock stock1 = new Stock(Code.newInstance("AAB.TO"), Board.Toronto);
Stock stock2 = new Stock(Code.newInstance("TRU.V"), Board.TSXV);


我想避免这种不便。我最初的计划是

public class Board {
    private final String board;
    private Board(String board) {
        this.board = board;
    }
    public Board newInstance(String board) {
        return new Board(board);
    }
}


但是,这不是内存有效的方法。这样,将创建Board的多个实例。

// 2 Toronto board instance will be created! Not memory efficient when we have huge stock list.
Stock stock0 = new Stock(Code.newInstance("AAA.TO"), Board.newInstance("Toronto"));
Stock stock1 = new Stock(Code.newInstance("AAB.TO"), Board.newInstance("Toronto"));
Stock stock2 = new Stock(Code.newInstance("TRU.V"), Board.newInstance("TSXV"));


我想知道我可以应用哪种数据结构,以便可以使用内存有效的方式表示常量(在我的上下文中,它表示Board类)

我不喜欢使用String,因为我更喜欢使用安全类型来区分Board和实际的String

最佳答案

嗯,如何将木板存放在集合或地图中?这样,您可以确保每个实例只有一个实例。

伪代码:

public class Board {
    private static final Set<Board> boards = new HashSet<>();

    public static Board getInstance(String board) {
        //search if board already exists on boards set, if it is, return that instance; else, add to list and return the newly created instance.
    }
    //override equals and hashCode appropriately
}

关于java - 运行时创建内存有效的常量的技术,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29404648/

10-10 06:15