otherNames) {
return new NameSymbol(Optional.of(name), Optional.of(symbol),
new HashSet<>(Objects.requireNonNull(otherNames,
"otherNames must not be null.")));
}
/**
* h * Gets a {@code NameSymbol} with a primary name, a symbol and additional
* names.
*
* @param name name to use
* @param symbol symbol to use
* @param otherNames other names to use
* @return NameSymbol instance
* @since 2019-10-21
* @throws NullPointerException if any argument is null
*/
public static final NameSymbol of(final String name, final String symbol,
final String... otherNames) {
return new NameSymbol(Optional.of(name), Optional.of(symbol),
new HashSet<>(Arrays.asList(Objects.requireNonNull(otherNames,
"otherNames must not be null."))));
}
/**
* 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;
final NameSymbol other = (NameSymbol) obj;
if (this.otherNames == null) {
if (other.otherNames != null)
return false;
} else if (!this.otherNames.equals(other.otherNames))
return false;
if (this.primaryName == null) {
if (other.primaryName != null)
return false;
} else if (!this.primaryName.equals(other.primaryName))
return false;
if (this.symbol == null) {
if (other.symbol != null)
return false;
} else if (!this.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
+ (this.otherNames == null ? 0 : this.otherNames.hashCode());
result = prime * result
+ (this.primaryName == null ? 0 : this.primaryName.hashCode());
result = prime * result
+ (this.symbol == null ? 0 : this.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();
}
@Override
public String toString() {
if (this.isEmpty())
return "NameSymbol.EMPTY";
else if (this.primaryName.isPresent() && this.symbol.isPresent())
return this.primaryName + " (" + this.symbol + ")";
else
return this.primaryName.orElseGet(this.symbol::orElseThrow);
}
}