Должен ли я «дублировать» поля при использовании композиции? - PullRequest
0 голосов
/ 07 июня 2018

Я использую класс символов (периодический элемент), который определяется как:

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

И я пишу класс элементов (химический элемент):

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

Я хочумой класс Элемент, чтобы дать простой доступ к atomicNumber.Я пытаюсь запретить цепочку геттеров следующим образом:

// Chaining getters
Element.H.getSymbol().getAtomicNumber();

какое из следующих решений мне следует использовать и почему?

Решение 1:

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

Решение 2:

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

Спасибо.

1 Ответ

0 голосов
/ 07 июня 2018

Если вы считаете, что удобство не связывать геттеры важно, вы должны использовать второй подход.дублирование полей подвержено ошибкам.Тем не менее, вы должны проверить свои основные предположения - я бы сказал, что атомный номер принадлежит элементу, а не символу;существует периодическая таблица элементов, а не символов.

...