summaryrefslogtreecommitdiff
path: root/src/org/unitConverter/unit/NameSymbol.java
diff options
context:
space:
mode:
authorAdrien Hopkins <ahopk127@my.yorku.ca>2021-03-13 16:21:49 -0500
committerAdrien Hopkins <ahopk127@my.yorku.ca>2021-03-13 16:21:49 -0500
commitfe4135a68cfed92ef336eec663e9c42c2c97dcbc (patch)
tree2fcf583265be3c575086f3ce3183a3268c997538 /src/org/unitConverter/unit/NameSymbol.java
parent761ba0b6627df8bc9f6ab41c94f349c84d378609 (diff)
parent184b7cc697ffc2dcbd49cfb3d0fd7b14bdac8803 (diff)
Merge branch 'feature-settings-tab' into develop
Diffstat (limited to 'src/org/unitConverter/unit/NameSymbol.java')
-rw-r--r--src/org/unitConverter/unit/NameSymbol.java317
1 files changed, 160 insertions, 157 deletions
diff --git a/src/org/unitConverter/unit/NameSymbol.java b/src/org/unitConverter/unit/NameSymbol.java
index 96fab45..8d8302a 100644
--- a/src/org/unitConverter/unit/NameSymbol.java
+++ b/src/org/unitConverter/unit/NameSymbol.java
@@ -19,6 +19,7 @@ package org.unitConverter.unit;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
@@ -30,227 +31,208 @@ import java.util.Set;
* @since 2019-10-21
*/
public final class NameSymbol {
- public static final NameSymbol EMPTY = new NameSymbol(Optional.empty(), Optional.empty(), new HashSet<>());
-
+ public static final NameSymbol EMPTY = new NameSymbol(Optional.empty(),
+ Optional.empty(), new HashSet<>());
+
/**
- * Gets a {@code NameSymbol} with a primary name, a symbol and no other names.
+ * Creates a {@code NameSymbol}, ensuring that if primaryName is null and
+ * otherNames is not empty, one name is moved from otherNames to primaryName
*
- * @param name
- * name to use
- * @param symbol
- * symbol to use
- * @return NameSymbol instance
- * @since 2019-10-21
- * @throws NullPointerException
- * if name or symbol is null
+ * Ensure that otherNames is a copy of the inputted argument.
*/
- public static final NameSymbol of(final String name, final String symbol) {
- return new NameSymbol(Optional.of(name), Optional.of(symbol), new HashSet<>());
+ private static final NameSymbol create(final String name,
+ final String symbol, final Set<String> otherNames) {
+ final Optional<String> primaryName;
+
+ if (name == null && !otherNames.isEmpty()) {
+ // get primary name and remove it from savedNames
+ final Iterator<String> it = otherNames.iterator();
+ assert it.hasNext();
+ primaryName = Optional.of(it.next());
+ otherNames.remove(primaryName.get());
+ } else {
+ primaryName = Optional.ofNullable(name);
+ }
+
+ return new NameSymbol(primaryName, Optional.ofNullable(symbol),
+ otherNames);
}
-
+
/**
- * Gets a {@code NameSymbol} with a primary name, a symbol and additional names.
+ * Gets a {@code NameSymbol} with a primary name, a symbol and no other
+ * names.
*
- * @param name
- * name to use
- * @param symbol
- * symbol to use
- * @param otherNames
- * other names to use
+ * @param name name to use
+ * @param symbol symbol to use
* @return NameSymbol instance
* @since 2019-10-21
- * @throws NullPointerException
- * if any argument is null
+ * @throws NullPointerException if name or symbol is null
*/
- public static final NameSymbol of(final String name, final String symbol, final Set<String> otherNames) {
+ public static final NameSymbol of(final String name, final String symbol) {
return new NameSymbol(Optional.of(name), Optional.of(symbol),
- new HashSet<>(Objects.requireNonNull(otherNames, "otherNames must not be null.")));
+ new HashSet<>());
}
-
+
/**
- * h * Gets a {@code NameSymbol} with a primary name, a symbol and additional names.
+ * 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
+ * @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
+ * @throws NullPointerException if any argument is null
*/
- public static final NameSymbol of(final String name, final String symbol, final String... otherNames) {
+ public static final NameSymbol of(final String name, final String symbol,
+ final Set<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, a symbol and an additional name.
- *
- * @param name
- * name to use
- * @param symbol
- * symbol to use
- * @param otherNames
- * other names to use
- * @param name2
- * alternate name
- * @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 name2) {
- final Set<String> otherNames = new HashSet<>();
- otherNames.add(Objects.requireNonNull(name2, "name2 must not be null."));
- return new NameSymbol(Optional.of(name), Optional.of(symbol), otherNames);
- }
-
- /**
- * 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
- * @param name2
- * alternate name
- * @param name3
- * alternate name
- * @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 name2, final String name3) {
- final Set<String> otherNames = new HashSet<>();
- otherNames.add(Objects.requireNonNull(name2, "name2 must not be null."));
- otherNames.add(Objects.requireNonNull(name3, "name3 must not be null."));
- return new NameSymbol(Optional.of(name), Optional.of(symbol), otherNames);
+ new HashSet<>(Objects.requireNonNull(otherNames,
+ "otherNames must not be null.")));
}
-
+
/**
- * Gets a {@code NameSymbol} with a primary name, a symbol and additional names.
+ * 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
- * @param name2
- * alternate name
- * @param name3
- * alternate name
- * @param name4
- * alternate name
+ * @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
+ * @throws NullPointerException if any argument is null
*/
- public static final NameSymbol of(final String name, final String symbol, final String name2, final String name3,
- final String name4) {
- final Set<String> 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);
+ 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.
+ * Gets a {@code NameSymbol} with a primary name, no symbol, and no other
+ * names.
*
- * @param name
- * name to use
+ * @param name name to use
* @return NameSymbol instance
* @since 2019-10-21
- * @throws NullPointerException
- * if name is null
+ * @throws NullPointerException if name is null
*/
public static final NameSymbol ofName(final String name) {
- return new NameSymbol(Optional.of(name), Optional.empty(), new HashSet<>());
+ return new NameSymbol(Optional.of(name), Optional.empty(),
+ new HashSet<>());
}
-
+
/**
- * Gets a {@code NameSymbol} with a primary name, a symbol and additional names.
+ * Gets a {@code NameSymbol} with a primary name, a symbol and additional
+ * names.
+ * <p>
+ * If any argument is null, this static factory replaces it with an empty
+ * Optional or empty Set.
* <p>
- * 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
+ * @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<String> otherNames) {
- return new NameSymbol(Optional.ofNullable(name), Optional.ofNullable(symbol),
+ public static final NameSymbol ofNullable(final String name,
+ final String symbol, final Set<String> 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.
+ * h * Gets a {@code NameSymbol} with a primary name, a symbol and additional
+ * names.
+ * <p>
+ * If any argument is null, this static factory replaces it with an empty
+ * Optional or empty Set.
* <p>
- * 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
+ * @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 new NameSymbol(Optional.ofNullable(name), Optional.ofNullable(symbol),
- otherNames == null ? new HashSet<>() : new HashSet<>(Arrays.asList(otherNames)));
+ 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
+ * @param symbol symbol to use
* @return NameSymbol instance
* @since 2019-10-21
- * @throws NullPointerException
- * if symbol is null
+ * @throws NullPointerException if symbol is null
*/
public static final NameSymbol ofSymbol(final String symbol) {
- return new NameSymbol(Optional.empty(), Optional.of(symbol), new HashSet<>());
+ return new NameSymbol(Optional.empty(), Optional.of(symbol),
+ new HashSet<>());
}
-
+
private final Optional<String> primaryName;
private final Optional<String> symbol;
-
+
private final Set<String> 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
+ * @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<String> primaryName, final Optional<String> symbol,
- final Set<String> otherNames) {
+ private NameSymbol(final Optional<String> primaryName,
+ final Optional<String> symbol, final Set<String> 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
@@ -258,7 +240,7 @@ public final class NameSymbol {
public final Set<String> getOtherNames() {
return this.otherNames;
}
-
+
/**
* @return primaryName
* @since 2019-10-21
@@ -266,7 +248,7 @@ public final class NameSymbol {
public final Optional<String> getPrimaryName() {
return this.primaryName;
}
-
+
/**
* @return symbol
* @since 2019-10-21
@@ -274,4 +256,25 @@ public final class NameSymbol {
public final Optional<String> 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();
+ }
} \ No newline at end of file