【问题标题】:Treating class as a constant将类视为常量
【发布时间】:2024-01-17 17:36:01
【问题描述】:
abstract class Coin{
    String name;
    String currency;


    class EUR extends Coin{
        EUR() {
        super("EUR", "€");
        }

    }
    class USD extends Coin{
        USD() {
        super("USD", "$");
        }

    }

    private Coin (String name, String currency){
    this.name = name
    this.currency = currency}
    }

class Person{
    ///variables
    Coin coin;

    Person(//Variables, Coin coin){
        //Other assignments
        this.coin = coin
    }

}

基本上我想初始化一个将欧元作为硬币传递的人,而不创建新的欧元。 类似的东西

static final EUR euro = EUR

然后:

Person person = new Person(... , euro);

我不需要数百万欧元的实例,所以我不想每次都创建一个新的欧元

我知道我可以使用常量字符串来做这样的事情,但我实际上想传递一个 Coin 对象

我也尝试像这样在 Coin 类中初始化 EUR

static EUR euro = new EUR();

但 IDE 警告我这可能会导致线程死锁

【问题讨论】:

  • 试试枚举而不是类?
  • 你需要使用枚举
  • 或者你可以定义public static final Coin EUR = new Coin("EUR", "€");

标签: java constants


【解决方案1】:

这对于枚举来说是一项完美的工作:

public enum Coin {
    EUR("EUR", "€"),
    USD("USD", "$");

    private String name;
    private String currency;

    private Coin(String name, String currency) {
        this.name = name;
        this.currency = currency;
    }
}

一旦你定义了它,你就可以使用枚举常量了:

Person person = new Person(... , Coin.EUR);

【讨论】:

  • 这是一个非常好的解决方案,如果没有人想出另一个,我会将其标记为解决方案
  • @lugiink 虽然可能还有其他解决方法,但这个问题正是enum 的设计者。我敢打赌,这个问题不会有更好的解决方案/答案。请考虑接受这个,让其他人看到它确实优雅地解决了问题