当我使用组合时,我应该 "duplicate" 字段吗?
Should I "duplicate" fields when I use composition?
我使用的符号 class(周期元素)定义为:
enum Symbol{
n(0),
H(1),
He(2),
Li(3),
Be(4),
B(5),
C(6),
N(7),
O(8),
F(9),
Ne(10),
//...
private final int atomicNumber;
Symbol(int atomicNumber)
{
this.atomicNumber = atomicNumber;
}
public int getAtomicNumber() {return atomicNumber;}
我正在写一个元素class(化学元素):
enum Element {
Neutron(Symbol.n, "Neutron"),
Hydrogen(Symbol.H, "Hydrogen"),
Helium(Symbol.He, "Helium"),
Lithium(Symbol.Li, "Lithium"),
Beryllium(Symbol.Be, "Beryllium"),
Boron(Symbol.B, "Boron"),
Carbon(Symbol.C, "Carbon"),
Nitrogen(Symbol.N, "Nitrogen"),
Oxygen(Symbol.O, "Oxygen"),
Fluorine(Symbol.F, "Fluorine"),
Neon(Symbol.Ne, "Neon"),
//...
private final Symbol symbol;
private final String name;
Element(Symbol symbol, String name)
{
this.symbol = symbol;
this.name = name;
}
public Symbol getSymbol(){return symbol;}
}
我希望我的元素 class 提供对 atomicNumber
的简单访问。我尝试禁止 getter 链接为:
// Chaining getters
Element.H.getSymbol().getAtomicNumber();
我应该使用以下哪一种解决方案,为什么?
解决方案一:
private final Symbol symbol;
private final String name;
private final int atomicNumber; // I added a field to Element
Element(Symbol symbol, String name)
{
this.symbol = symbol;
this.name = name;
this.atomicNumber = symbol.getAtomicNumber();
}
// I implemented the corresponding getter (this.atomicNumber)
public int getAtomicNumber(){return atomicNumber;}
方案二:
private final Symbol symbol;
private final String name;
Element(Symbol symbol, String name)
{
this.symbol = symbol;
this.name = name;
}
// I get atomicNumber from this.symbol
public int getAtomicNumber(){return symbol.getAtomicNumber());}
谢谢。
如果您认为不链接 getter 的便利性很重要,那么您应该使用第二种方法。复制字段很容易出错。
尽管如此,您还是应该检查您的基本假设——我认为原子序数属于元素而不是符号;有周期性的 table 元素,而不是符号。
我使用的符号 class(周期元素)定义为:
enum Symbol{
n(0),
H(1),
He(2),
Li(3),
Be(4),
B(5),
C(6),
N(7),
O(8),
F(9),
Ne(10),
//...
private final int atomicNumber;
Symbol(int atomicNumber)
{
this.atomicNumber = atomicNumber;
}
public int getAtomicNumber() {return atomicNumber;}
我正在写一个元素class(化学元素):
enum Element {
Neutron(Symbol.n, "Neutron"),
Hydrogen(Symbol.H, "Hydrogen"),
Helium(Symbol.He, "Helium"),
Lithium(Symbol.Li, "Lithium"),
Beryllium(Symbol.Be, "Beryllium"),
Boron(Symbol.B, "Boron"),
Carbon(Symbol.C, "Carbon"),
Nitrogen(Symbol.N, "Nitrogen"),
Oxygen(Symbol.O, "Oxygen"),
Fluorine(Symbol.F, "Fluorine"),
Neon(Symbol.Ne, "Neon"),
//...
private final Symbol symbol;
private final String name;
Element(Symbol symbol, String name)
{
this.symbol = symbol;
this.name = name;
}
public Symbol getSymbol(){return symbol;}
}
我希望我的元素 class 提供对 atomicNumber
的简单访问。我尝试禁止 getter 链接为:
// Chaining getters
Element.H.getSymbol().getAtomicNumber();
我应该使用以下哪一种解决方案,为什么?
解决方案一:
private final Symbol symbol;
private final String name;
private final int atomicNumber; // I added a field to Element
Element(Symbol symbol, String name)
{
this.symbol = symbol;
this.name = name;
this.atomicNumber = symbol.getAtomicNumber();
}
// I implemented the corresponding getter (this.atomicNumber)
public int getAtomicNumber(){return atomicNumber;}
方案二:
private final Symbol symbol;
private final String name;
Element(Symbol symbol, String name)
{
this.symbol = symbol;
this.name = name;
}
// I get atomicNumber from this.symbol
public int getAtomicNumber(){return symbol.getAtomicNumber());}
谢谢。
如果您认为不链接 getter 的便利性很重要,那么您应该使用第二种方法。复制字段很容易出错。 尽管如此,您还是应该检查您的基本假设——我认为原子序数属于元素而不是符号;有周期性的 table 元素,而不是符号。