otherNames = new HashSet<>();
otherNames.add(Objects.requireNonNull(name2, "name2 must not be null."));
otherNames.add(Objects.requireNonNull(name3, "name3 must not be null."));
otherNames.add(Objects.requireNonNull(name4, "name4 must not be null."));
return new NameSymbol(Optional.of(name), Optional.of(symbol), otherNames);
}
/**
* Gets a {@code NameSymbol} with a primary name, no symbol, and no other names.
*
* @param name name to use
* @return NameSymbol instance
* @since 2019-10-21
* @throws NullPointerException if name is null
*/
public static final NameSymbol ofName(final String name) {
return new NameSymbol(Optional.of(name), Optional.empty(), new HashSet<>());
}
/**
* Gets a {@code NameSymbol} with a primary name, a symbol and additional names.
*
* If any argument is null, this static factory replaces it with an empty
* Optional or empty Set.
*
* If {@code name} is null and {@code otherNames} is not empty, a primary name
* will be picked from {@code otherNames}. This name will not appear in
* getOtherNames().
*
* @param name name to use
* @param symbol symbol to use
* @param otherNames other names to use
* @return NameSymbol instance
* @since 2019-11-26
*/
public static final NameSymbol ofNullable(final String name, final String symbol, final Set otherNames) {
return NameSymbol.create(name, symbol, otherNames == null ? new HashSet<>() : new HashSet<>(otherNames));
}
/**
* h * Gets a {@code NameSymbol} with a primary name, a symbol and additional
* names.
*
* If any argument is null, this static factory replaces it with an empty
* Optional or empty Set.
*
* If {@code name} is null and {@code otherNames} is not empty, a primary name
* will be picked from {@code otherNames}. This name will not appear in
* getOtherNames().
*
* @param name name to use
* @param symbol symbol to use
* @param otherNames other names to use
* @return NameSymbol instance
* @since 2019-11-26
*/
public static final NameSymbol ofNullable(final String name, final String symbol, final String... otherNames) {
return create(name, symbol, otherNames == null ? new HashSet<>() : new HashSet<>(Arrays.asList(otherNames)));
}
/**
* Gets a {@code NameSymbol} with a symbol and no names.
*
* @param symbol symbol to use
* @return NameSymbol instance
* @since 2019-10-21
* @throws NullPointerException if symbol is null
*/
public static final NameSymbol ofSymbol(final String symbol) {
return new NameSymbol(Optional.empty(), Optional.of(symbol), new HashSet<>());
}
private final Optional primaryName;
private final Optional symbol;
private final Set otherNames;
/**
* Creates the {@code NameSymbol}.
*
* @param primaryName primary name of unit
* @param symbol symbol used to represent unit
* @param otherNames other names and/or spellings, should be a mutable copy of
* the argument
* @since 2019-10-21
*/
private NameSymbol(final Optional primaryName, final Optional symbol,
final Set otherNames) {
this.primaryName = primaryName;
this.symbol = symbol;
otherNames.remove(null);
this.otherNames = Collections.unmodifiableSet(otherNames);
if (this.primaryName.isEmpty())
assert this.otherNames.isEmpty();
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!(obj instanceof NameSymbol))
return false;
NameSymbol other = (NameSymbol) obj;
if (otherNames == null) {
if (other.otherNames != null)
return false;
} else if (!otherNames.equals(other.otherNames))
return false;
if (primaryName == null) {
if (other.primaryName != null)
return false;
} else if (!primaryName.equals(other.primaryName))
return false;
if (symbol == null) {
if (other.symbol != null)
return false;
} else if (!symbol.equals(other.symbol))
return false;
return true;
}
/**
* @return otherNames
* @since 2019-10-21
*/
public final Set getOtherNames() {
return this.otherNames;
}
/**
* @return primaryName
* @since 2019-10-21
*/
public final Optional getPrimaryName() {
return this.primaryName;
}
/**
* @return symbol
* @since 2019-10-21
*/
public final Optional getSymbol() {
return this.symbol;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((otherNames == null) ? 0 : otherNames.hashCode());
result = prime * result + ((primaryName == null) ? 0 : primaryName.hashCode());
result = prime * result + ((symbol == null) ? 0 : symbol.hashCode());
return result;
}
/**
* @return true iff this {@code NameSymbol} contains no names or symbols.
*/
public final boolean isEmpty() {
// if primaryName is empty, otherNames must also be empty
return this.primaryName.isEmpty() && this.symbol.isEmpty();
}
}