ICU-21349 Change UnitConverter name to UnitsConverter

See #1557
diff --git a/icu4c/source/i18n/units_complexconverter.cpp b/icu4c/source/i18n/units_complexconverter.cpp
index 7e9c713..74d9c67 100644
--- a/icu4c/source/i18n/units_complexconverter.cpp
+++ b/icu4c/source/i18n/units_complexconverter.cpp
@@ -32,7 +32,7 @@
     // Just borrowing a pointer to the instance
     MeasureUnitImpl *biggestUnit = units_[0]->unitImpl.getAlias();
     for (int32_t i = 1; i < units_.length(); i++) {
-        if (UnitConverter::compareTwoUnits(*units_[i]->unitImpl, *biggestUnit, ratesInfo, status) > 0 &&
+        if (UnitsConverter::compareTwoUnits(*units_[i]->unitImpl, *biggestUnit, ratesInfo, status) > 0 &&
             U_SUCCESS(status)) {
             biggestUnit = units_[i]->unitImpl.getAlias();
         }
@@ -69,7 +69,7 @@
         const auto *rightPointer = static_cast<const MeasureUnitImplWithIndex *const *>(right);
 
         // Multiply by -1 to sort in descending order
-        return (-1) * UnitConverter::compareTwoUnits(*((**leftPointer).unitImpl) /* left unit*/,     //
+        return (-1) * UnitsConverter::compareTwoUnits(*((**leftPointer).unitImpl) /* left unit*/,     //
                                                      *((**rightPointer).unitImpl) /* right unit */,  //
                                                      *static_cast<const ConversionRates *>(context), //
                                                      status);
@@ -100,10 +100,10 @@
     //              3. then, the final result will be (6 feet and 6.74016 inches)
     for (int i = 0, n = units_.length(); i < n; i++) {
         if (i == 0) { // first element
-            unitConverters_.emplaceBackAndCheckErrorCode(status, inputUnit, *(units_[i]->unitImpl),
+            unitsConverters_.emplaceBackAndCheckErrorCode(status, inputUnit, *(units_[i]->unitImpl),
                                                          ratesInfo, status);
         } else {
-            unitConverters_.emplaceBackAndCheckErrorCode(status, *(units_[i - 1]->unitImpl),
+            unitsConverters_.emplaceBackAndCheckErrorCode(status, *(units_[i - 1]->unitImpl),
                                                          *(units_[i]->unitImpl), ratesInfo, status);
         }
 
@@ -114,10 +114,10 @@
 }
 
 UBool ComplexUnitsConverter::greaterThanOrEqual(double quantity, double limit) const {
-    U_ASSERT(unitConverters_.length() > 0);
+    U_ASSERT(unitsConverters_.length() > 0);
 
     // First converter converts to the biggest quantity.
-    double newQuantity = unitConverters_[0]->convert(quantity);
+    double newQuantity = unitsConverters_[0]->convert(quantity);
     return newQuantity >= limit;
 }
 
@@ -137,14 +137,14 @@
     // - the following N-2 converters convert to bigger units for which we want integers,
     // - the Nth converter (index N-1) converts to the smallest unit, for which
     //   we keep a double.
-    MaybeStackArray<int64_t, 5> intValues(unitConverters_.length() - 1, status);
+    MaybeStackArray<int64_t, 5> intValues(unitsConverters_.length() - 1, status);
     if (U_FAILURE(status)) {
         return result;
     }
-    uprv_memset(intValues.getAlias(), 0, (unitConverters_.length() - 1) * sizeof(int64_t));
+    uprv_memset(intValues.getAlias(), 0, (unitsConverters_.length() - 1) * sizeof(int64_t));
 
-    for (int i = 0, n = unitConverters_.length(); i < n; ++i) {
-        quantity = (*unitConverters_[i]).convert(quantity);
+    for (int i = 0, n = unitsConverters_.length(); i < n; ++i) {
+        quantity = (*unitsConverters_[i]).convert(quantity);
         if (i < n - 1) {
             // If quantity is at the limits of double's precision from an
             // integer value, we take that integer value.
@@ -168,13 +168,13 @@
 
     // Initialize empty result. We use a MaybeStackArray directly so we can
     // assign pointers - for this privilege we have to take care of cleanup.
-    MaybeStackArray<Measure *, 4> tmpResult(unitConverters_.length(), status);
+    MaybeStackArray<Measure *, 4> tmpResult(unitsConverters_.length(), status);
     if (U_FAILURE(status)) {
         return result;
     }
 
     // Package values into temporary Measure instances in tmpResult:
-    for (int i = 0, n = unitConverters_.length(); i < n; ++i) {
+    for (int i = 0, n = unitsConverters_.length(); i < n; ++i) {
         if (i < n - 1) {
             Formattable formattableQuantity(intValues[i] * sign);
             // Measure takes ownership of the MeasureUnit*
@@ -190,7 +190,7 @@
 
 
     // Transfer values into result and return:
-    for(int32_t i = 0, n = unitConverters_.length(); i < n; ++i) {
+    for(int32_t i = 0, n = unitsConverters_.length(); i < n; ++i) {
         U_ASSERT(tmpResult[i] != nullptr);
         result.emplaceBackAndCheckErrorCode(status, *tmpResult[i]);
         delete tmpResult[i];
@@ -215,27 +215,27 @@
     }
     quantity = decimalQuantity.toDouble();
 
-    int32_t lastIndex = unitConverters_.length() - 1;
+    int32_t lastIndex = unitsConverters_.length() - 1;
     if (lastIndex == 0) {
         // Only one element, no need to bubble up the carry
         return;
     }
 
     // Check if there's a carry, and bubble it back up the resulting intValues.
-    int64_t carry = floor(unitConverters_[lastIndex]->convertInverse(quantity) * (1 + DBL_EPSILON));
+    int64_t carry = floor(unitsConverters_[lastIndex]->convertInverse(quantity) * (1 + DBL_EPSILON));
     if (carry <= 0) {
         return;
     }
-    quantity -= unitConverters_[lastIndex]->convert(carry);
+    quantity -= unitsConverters_[lastIndex]->convert(carry);
     intValues[lastIndex - 1] += carry;
 
     // We don't use the first converter: that one is for the input unit
     for (int32_t j = lastIndex - 1; j > 0; j--) {
-        carry = floor(unitConverters_[j]->convertInverse(intValues[j]) * (1 + DBL_EPSILON));
+        carry = floor(unitsConverters_[j]->convertInverse(intValues[j]) * (1 + DBL_EPSILON));
         if (carry <= 0) {
             return;
         }
-        intValues[j] -= round(unitConverters_[j]->convert(carry));
+        intValues[j] -= round(unitsConverters_[j]->convert(carry));
         intValues[j - 1] += carry;
     }
 }
diff --git a/icu4c/source/i18n/units_complexconverter.h b/icu4c/source/i18n/units_complexconverter.h
index a727ea9..581e52f 100644
--- a/icu4c/source/i18n/units_complexconverter.h
+++ b/icu4c/source/i18n/units_complexconverter.h
@@ -24,9 +24,9 @@
 // Note: These need to be outside of the units namespace, or Clang will generate
 // a compile error.
 #if U_PF_WINDOWS <= U_PLATFORM && U_PLATFORM <= U_PF_CYGWIN
-template class U_I18N_API MaybeStackArray<units::UnitConverter*, 8>;
-template class U_I18N_API MemoryPool<units::UnitConverter, 8>;
-template class U_I18N_API MaybeStackVector<units::UnitConverter, 8>;
+template class U_I18N_API MaybeStackArray<units::UnitsConverter*, 8>;
+template class U_I18N_API MemoryPool<units::UnitsConverter, 8>;
+template class U_I18N_API MaybeStackVector<units::UnitsConverter, 8>;
 template class U_I18N_API MaybeStackArray<MeasureUnitImpl*, 8>;
 template class U_I18N_API MemoryPool<MeasureUnitImpl, 8>;
 template class U_I18N_API MaybeStackVector<MeasureUnitImpl, 8>;
@@ -42,9 +42,9 @@
  * For example, from `meter` to `foot+inch`.
  *
  *  DESIGN:
- *    This class uses `UnitConverter` in order to perform the single converter (i.e. converters from a
+ *    This class uses `UnitsConverter` in order to perform the single converter (i.e. converters from a
  *    single unit to another single unit). Therefore, `ComplexUnitsConverter` class contains multiple
- *    instances of the `UnitConverter` to perform the conversion.
+ *    instances of the `UnitsConverter` to perform the conversion.
  */
 class U_I18N_API ComplexUnitsConverter : public UMemory {
   public:
@@ -94,14 +94,14 @@
     convert(double quantity, icu::number::impl::RoundingImpl *rounder, UErrorCode &status) const;
 
   private:
-    MaybeStackVector<UnitConverter> unitConverters_;
+    MaybeStackVector<UnitsConverter> unitsConverters_;
 
     // Individual units of mixed units, sorted big to small, with indices
     // indicating the requested output mixed unit order.
     MaybeStackVector<MeasureUnitImplWithIndex> units_;
 
     // Sorts units_, which must be populated before calling this, and populates
-    // unitConverters_.
+    // unitsConverters_.
     void init(const MeasureUnitImpl &inputUnit, const ConversionRates &ratesInfo, UErrorCode &status);
 
     // Applies the rounder to the quantity (last element) and bubble up any carried value to all the
diff --git a/icu4c/source/i18n/units_converter.cpp b/icu4c/source/i18n/units_converter.cpp
index cbaa81f..f4d8f90 100644
--- a/icu4c/source/i18n/units_converter.cpp
+++ b/icu4c/source/i18n/units_converter.cpp
@@ -272,7 +272,7 @@
 /**
  *  Extract conversion rate from `source` to `target`
  */
-// In ICU4J, this function is partially inlined in the UnitConverter constructor.
+// In ICU4J, this function is partially inlined in the UnitsConverter constructor.
 void loadConversionRate(ConversionRate &conversionRate, const MeasureUnitImpl &source,
                         const MeasureUnitImpl &target, Convertibility unitsState,
                         const ConversionRates &ratesInfo, UErrorCode &status) {
@@ -489,7 +489,7 @@
     return UNCONVERTIBLE;
 }
 
-UnitConverter::UnitConverter(const MeasureUnitImpl &source, const MeasureUnitImpl &target,
+UnitsConverter::UnitsConverter(const MeasureUnitImpl &source, const MeasureUnitImpl &target,
                              const ConversionRates &ratesInfo, UErrorCode &status)
     : conversionRate_(source.copy(status), target.copy(status)) {
     if (source.complexity == UMeasureUnitComplexity::UMEASURE_UNIT_MIXED ||
@@ -509,7 +509,7 @@
                        ratesInfo, status);
 }
 
-int32_t UnitConverter::compareTwoUnits(const MeasureUnitImpl &firstUnit,
+int32_t UnitsConverter::compareTwoUnits(const MeasureUnitImpl &firstUnit,
                                        const MeasureUnitImpl &secondUnit,
                                        const ConversionRates &ratesInfo, UErrorCode &status) {
     if (U_FAILURE(status)) {
@@ -555,7 +555,7 @@
     return 0;
 }
 
-double UnitConverter::convert(double inputValue) const {
+double UnitsConverter::convert(double inputValue) const {
     double result =
         inputValue + conversionRate_.sourceOffset; // Reset the input to the target zero index.
     // Convert the quantity to from the source scale to the target scale.
@@ -576,7 +576,7 @@
     return result;
 }
 
-double UnitConverter::convertInverse(double inputValue) const {
+double UnitsConverter::convertInverse(double inputValue) const {
     double result = inputValue;
     if (conversionRate_.reciprocal) {
         if (result == 0) {
diff --git a/icu4c/source/i18n/units_converter.h b/icu4c/source/i18n/units_converter.h
index a22863a..f492614 100644
--- a/icu4c/source/i18n/units_converter.h
+++ b/icu4c/source/i18n/units_converter.h
@@ -137,7 +137,7 @@
  *    Only works with SINGLE and COMPOUND units. If one of the units is a
  *    MIXED unit, an error will occur. For more information, see UMeasureUnitComplexity.
  */
-class U_I18N_API UnitConverter : public UMemory {
+class U_I18N_API UnitsConverter : public UMemory {
   public:
     /**
      * Constructor of `UnitConverter`.
@@ -150,7 +150,7 @@
      * @param ratesInfo Contains all the needed conversion rates.
      * @param status
      */
-    UnitConverter(const MeasureUnitImpl &source, const MeasureUnitImpl &target,
+    UnitsConverter(const MeasureUnitImpl &source, const MeasureUnitImpl &target,
                   const ConversionRates &ratesInfo, UErrorCode &status);
 
     /**
diff --git a/icu4c/source/test/intltest/units_test.cpp b/icu4c/source/test/intltest/units_test.cpp
index 8db46be..e6f66a0 100644
--- a/icu4c/source/test/intltest/units_test.cpp
+++ b/icu4c/source/test/intltest/units_test.cpp
@@ -47,7 +47,7 @@
     void testExtractConvertibility();
     void testConverterWithCLDRTests();
     void testComplexUnitsConverter();
-    void testComplexUnitConverterSorting();
+    void testComplexUnitsConverterSorting();
     void testUnitPreferencesWithCLDRTests();
     void testConverter();
 };
@@ -63,7 +63,7 @@
     TESTCASE_AUTO(testExtractConvertibility);
     TESTCASE_AUTO(testConverterWithCLDRTests);
     TESTCASE_AUTO(testComplexUnitsConverter);
-    TESTCASE_AUTO(testComplexUnitConverterSorting);
+    TESTCASE_AUTO(testComplexUnitsConverterSorting);
     TESTCASE_AUTO(testUnitPreferencesWithCLDRTests);
     TESTCASE_AUTO(testConverter);
     TESTCASE_AUTO_END;
@@ -250,8 +250,8 @@
         if (status.errIfFailureAndReset("conversionRates(status)")) {
             continue;
         }
-        UnitConverter converter(source, target, conversionRates, status);
-        if (status.errIfFailureAndReset("UnitConverter(<%s>, <%s>, ...)", testCase.source,
+        UnitsConverter converter(source, target, conversionRates, status);
+        if (status.errIfFailureAndReset("UnitsConverter(<%s>, <%s>, ...)", testCase.source,
                                         testCase.target)) {
             continue;
         }
@@ -368,8 +368,8 @@
     unitsTest->assertNotEquals(msg.data(), UNCONVERTIBLE, convertibility);
 
     // Conversion:
-    UnitConverter converter(sourceUnit, targetUnit, *ctx->conversionRates, status);
-    if (status.errIfFailureAndReset("UnitConverter(<%s>, <%s>, ...)", sourceIdent.data(),
+    UnitsConverter converter(sourceUnit, targetUnit, *ctx->conversionRates, status);
+    if (status.errIfFailureAndReset("UnitsConverter(<%s>, <%s>, ...)", sourceIdent.data(),
                                     targetIdent.data())) {
         return;
     }
@@ -555,8 +555,8 @@
     // TODO(icu-units#63): test negative numbers!
 }
 
-void UnitsTest::testComplexUnitConverterSorting() {
-    IcuTestErrorCode status(*this, "UnitsTest::testComplexUnitConverterSorting");
+void UnitsTest::testComplexUnitsConverterSorting() {
+    IcuTestErrorCode status(*this, "UnitsTest::testComplexUnitsConverterSorting");
     ConversionRates conversionRates(status);
 
     status.assertSuccess();
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/units/ComplexUnitsConverter.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/units/ComplexUnitsConverter.java
index 3ea9030..134faa3 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/units/ComplexUnitsConverter.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/units/ComplexUnitsConverter.java
@@ -17,14 +17,14 @@
 /**
  * Converts from single or compound unit to single, compound or mixed units. For example, from `meter` to `foot+inch`.
  * <p>
- * DESIGN: This class uses `UnitConverter` in order to perform the single converter (i.e. converters from a single unit
- * to another single unit). Therefore, `ComplexUnitsConverter` class contains multiple instances of the `UnitConverter`
- * to perform the conversion.
+ * DESIGN: This class uses <code>UnitsConverter</code> in order to perform the single converter (i.e. converters from
+ * a single unit to another single unit). Therefore, <code>ComplexUnitsConverter</code> class contains multiple
+ * instances of the <code>UnitsConverter</code> to perform the conversion.
  */
 public class ComplexUnitsConverter {
     public static final BigDecimal EPSILON = BigDecimal.valueOf(Math.ulp(1.0));
     public static final BigDecimal EPSILON_MULTIPLIER = BigDecimal.valueOf(1).add(EPSILON);
-    private ArrayList<UnitConverter> unitConverters_;
+    private ArrayList<UnitsConverter> unitsConverters_;
     /**
      * Individual units of mixed units, sorted big to small, with indices
      * indicating the requested output mixed unit order.
@@ -80,7 +80,7 @@
 
     /**
      * Sorts units_, which must be populated before calling this, and populates
-     * unitConverters_.
+     * unitsConverters_.
      */
     private void init(ConversionRates conversionRates) {
         // Sort the units in a descending order.
@@ -101,13 +101,13 @@
         //              2. convert the residual of 6.56168 feet (0.56168) to inches, which will be (6.74016
         //              inches)
         //              3. then, the final result will be (6 feet and 6.74016 inches)
-        unitConverters_ = new ArrayList<>();
+        unitsConverters_ = new ArrayList<>();
         for (int i = 0, n = units_.size(); i < n; i++) {
             if (i == 0) { // first element
-                unitConverters_.add(new UnitConverter(this.inputUnit_, units_.get(i).unitImpl, conversionRates));
+                unitsConverters_.add(new UnitsConverter(this.inputUnit_, units_.get(i).unitImpl, conversionRates));
             } else {
-                unitConverters_
-                        .add(new UnitConverter(units_.get(i - 1).unitImpl, units_.get(i).unitImpl, conversionRates));
+                unitsConverters_
+                        .add(new UnitsConverter(units_.get(i - 1).unitImpl, units_.get(i).unitImpl, conversionRates));
             }
         }
     }
@@ -123,7 +123,7 @@
         assert !units_.isEmpty();
 
         // NOTE: First converter converts to the biggest quantity.
-        return unitConverters_.get(0).convert(quantity).multiply(EPSILON_MULTIPLIER).compareTo(limit) >= 0;
+        return unitsConverters_.get(0).convert(quantity).multiply(EPSILON_MULTIPLIER).compareTo(limit) >= 0;
     }
 
     public static class ComplexConverterResult {
@@ -157,9 +157,9 @@
         // - N-1 converters convert to bigger units for which we want integers,
         // - the Nth converter (index N-1) converts to the smallest unit, which
         //   isn't (necessarily) an integer.
-        List<BigInteger> intValues = new ArrayList<>(unitConverters_.size() - 1);
-        for (int i = 0, n = unitConverters_.size(); i < n; ++i) {
-            quantity = (unitConverters_.get(i)).convert(quantity);
+        List<BigInteger> intValues = new ArrayList<>(unitsConverters_.size() - 1);
+        for (int i = 0, n = unitsConverters_.size(); i < n; ++i) {
+            quantity = (unitsConverters_.get(i)).convert(quantity);
 
             if (i < n - 1) {
                 // The double type has 15 decimal digits of precision. For choosing
@@ -185,14 +185,14 @@
         quantity = applyRounder(intValues, quantity, rounder);
 
         // Initialize empty measures.
-        List<Measure> measures = new ArrayList<>(unitConverters_.size());
-        for (int i = 0; i < unitConverters_.size(); i++) {
+        List<Measure> measures = new ArrayList<>(unitsConverters_.size());
+        for (int i = 0; i < unitsConverters_.size(); i++) {
             measures.add(null);
         }
 
         // Package values into Measure instances in measures:
         int indexOfQuantity = -1;
-        for (int i = 0, n = unitConverters_.size(); i < n; ++i) {
+        for (int i = 0, n = unitsConverters_.size(); i < n; ++i) {
             if (i < n - 1) {
                 Measure measure = new Measure(intValues.get(i).multiply(sign), units_.get(i).unitImpl.build());
                 measures.set(units_.get(i).index, measure);
@@ -228,25 +228,25 @@
         }
 
         // Check if there's a carry, and bubble it back up the resulting intValues.
-        int lastIndex = unitConverters_.size() - 1;
-        BigDecimal carry = unitConverters_.get(lastIndex).convertInverse(quantity).multiply(EPSILON_MULTIPLIER)
+        int lastIndex = unitsConverters_.size() - 1;
+        BigDecimal carry = unitsConverters_.get(lastIndex).convertInverse(quantity).multiply(EPSILON_MULTIPLIER)
                 .setScale(0, RoundingMode.FLOOR);
         if (carry.compareTo(BigDecimal.ZERO) <= 0) { // carry is not greater than zero
             return quantity;
         }
-        quantity = quantity.subtract(unitConverters_.get(lastIndex).convert(carry));
+        quantity = quantity.subtract(unitsConverters_.get(lastIndex).convert(carry));
         intValues.set(lastIndex - 1, intValues.get(lastIndex - 1).add(carry.toBigInteger()));
 
         // We don't use the first converter: that one is for the input unit
         for (int j = lastIndex - 1; j > 0; j--) {
-            carry = unitConverters_.get(j)
+            carry = unitsConverters_.get(j)
                     .convertInverse(BigDecimal.valueOf(intValues.get(j).longValue()))
                     .multiply(EPSILON_MULTIPLIER)
                     .setScale(0, RoundingMode.FLOOR);
             if (carry.compareTo(BigDecimal.ZERO) <= 0) { // carry is not greater than zero
                 break;
             }
-            intValues.set(j, intValues.get(j).subtract(unitConverters_.get(j).convert(carry).toBigInteger()));
+            intValues.set(j, intValues.get(j).subtract(unitsConverters_.get(j).convert(carry).toBigInteger()));
             intValues.set(j - 1, intValues.get(j - 1).add(carry.toBigInteger()));
         }
 
@@ -255,6 +255,6 @@
 
     @Override
     public String toString() {
-        return "ComplexUnitsConverter [unitConverters_=" + unitConverters_ + ", units_=" + units_ + "]";
+        return "ComplexUnitsConverter [unitsConverters_=" + unitsConverters_ + ", units_=" + units_ + "]";
     }
 }
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/units/ConversionRates.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/units/ConversionRates.java
index 13fecf2..db6fa9e 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/units/ConversionRates.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/units/ConversionRates.java
@@ -38,10 +38,10 @@
      * @return
      */
     // In ICU4C, this is called loadCompoundFactor().
-    private UnitConverter.Factor getFactorToBase(SingleUnitImpl singleUnit) {
+    private UnitsConverter.Factor getFactorToBase(SingleUnitImpl singleUnit) {
         int power = singleUnit.getDimensionality();
         MeasureUnit.MeasurePrefix unitPrefix = singleUnit.getPrefix();
-        UnitConverter.Factor result = UnitConverter.Factor.processFactor(mapToConversionRate.get(singleUnit.getSimpleUnitID()).getConversionRate());
+        UnitsConverter.Factor result = UnitsConverter.Factor.processFactor(mapToConversionRate.get(singleUnit.getSimpleUnitID()).getConversionRate());
 
         // Prefix before power, because:
         // - square-kilometer to square-meter: (1000)^2
@@ -49,8 +49,8 @@
         return result.applyPrefix(unitPrefix).power(power);
     }
 
-    public UnitConverter.Factor getFactorToBase(MeasureUnitImpl measureUnit) {
-        UnitConverter.Factor result = new UnitConverter.Factor();
+    public UnitsConverter.Factor getFactorToBase(MeasureUnitImpl measureUnit) {
+        UnitsConverter.Factor result = new UnitsConverter.Factor();
         for (SingleUnitImpl singleUnit :
                 measureUnit.getSingleUnits()) {
             result = result.multiply(getFactorToBase(singleUnit));
@@ -60,9 +60,9 @@
     }
 
     // In ICU4C, this functionality is found in loadConversionRate().
-    protected BigDecimal getOffset(MeasureUnitImpl source, MeasureUnitImpl target, UnitConverter.Factor
-            sourceToBase, UnitConverter.Factor targetToBase, UnitConverter.Convertibility convertibility) {
-        if (convertibility != UnitConverter.Convertibility.CONVERTIBLE) return BigDecimal.valueOf(0);
+    protected BigDecimal getOffset(MeasureUnitImpl source, MeasureUnitImpl target, UnitsConverter.Factor
+            sourceToBase, UnitsConverter.Factor targetToBase, UnitsConverter.Convertibility convertibility) {
+        if (convertibility != UnitsConverter.Convertibility.CONVERTIBLE) return BigDecimal.valueOf(0);
         if (!(checkSimpleUnit(source) && checkSimpleUnit(target))) return BigDecimal.valueOf(0);
 
         String sourceSimpleIdentifier = source.getSingleUnits().get(0).getSimpleUnitID();
diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/units/UnitConverter.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/units/UnitsConverter.java
similarity index 97%
rename from icu4j/main/classes/core/src/com/ibm/icu/impl/units/UnitConverter.java
rename to icu4j/main/classes/core/src/com/ibm/icu/impl/units/UnitsConverter.java
index a0d98ad..4d6d2e0 100644
--- a/icu4j/main/classes/core/src/com/ibm/icu/impl/units/UnitConverter.java
+++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/units/UnitsConverter.java
@@ -11,12 +11,12 @@
 
 import com.ibm.icu.util.MeasureUnit;
 
-public class UnitConverter {
+public class UnitsConverter {
     private BigDecimal conversionRate;
     private BigDecimal offset;
 
     /**
-     * Constructor of `UnitConverter`.
+     * Constructor of <code>UnitsConverter</code>.
      * NOTE:
      * - source and target must be under the same category
      * - e.g. meter to mile --> both of them are length units.
@@ -25,7 +25,7 @@
      * @param target          represents the target unit.
      * @param conversionRates contains all the needed conversion rates.
      */
-    public UnitConverter(MeasureUnitImpl source, MeasureUnitImpl target, ConversionRates conversionRates) {
+    public UnitsConverter(MeasureUnitImpl source, MeasureUnitImpl target, ConversionRates conversionRates) {
         Convertibility convertibility = extractConvertibility(source, target, conversionRates);
         assert (convertibility == Convertibility.CONVERTIBLE || convertibility == Convertibility.RECIPROCAL);
 
@@ -347,6 +347,6 @@
 
     @Override
     public String toString() {
-        return "UnitConverter [conversionRate=" + conversionRate + ", offset=" + offset + "]";
+        return "UnitsConverter [conversionRate=" + conversionRate + ", offset=" + offset + "]";
     }
 }
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/impl/UnitsTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/impl/UnitsTest.java
index f0899a1..3a67201 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/impl/UnitsTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/impl/UnitsTest.java
@@ -20,7 +20,7 @@
 import com.ibm.icu.impl.units.ComplexUnitsConverter;
 import com.ibm.icu.impl.units.ConversionRates;
 import com.ibm.icu.impl.units.MeasureUnitImpl;
-import com.ibm.icu.impl.units.UnitConverter;
+import com.ibm.icu.impl.units.UnitsConverter;
 import com.ibm.icu.impl.units.UnitsRouter;
 import com.ibm.icu.util.Measure;
 import com.ibm.icu.util.MeasureUnit;
@@ -235,9 +235,9 @@
         class TestData {
             MeasureUnitImpl source;
             MeasureUnitImpl target;
-            UnitConverter.Convertibility expected;
+            UnitsConverter.Convertibility expected;
 
-            TestData(String source, String target, UnitConverter.Convertibility convertibility) {
+            TestData(String source, String target, UnitsConverter.Convertibility convertibility) {
                 this.source = MeasureUnitImpl.UnitsParser.parseForIdentifier(source);
                 this.target = MeasureUnitImpl.UnitsParser.parseForIdentifier(target);
                 this.expected = convertibility;
@@ -245,29 +245,29 @@
         }
 
         TestData[] tests = {
-                new TestData("meter", "foot", UnitConverter.Convertibility.CONVERTIBLE),
-                new TestData("kilometer", "foot", UnitConverter.Convertibility.CONVERTIBLE),
-                new TestData("hectare", "square-foot", UnitConverter.Convertibility.CONVERTIBLE),
-                new TestData("kilometer-per-second", "second-per-meter", UnitConverter.Convertibility.RECIPROCAL),
-                new TestData("square-meter", "square-foot", UnitConverter.Convertibility.CONVERTIBLE),
-                new TestData("kilometer-per-second", "foot-per-second", UnitConverter.Convertibility.CONVERTIBLE),
-                new TestData("square-hectare", "pow4-foot", UnitConverter.Convertibility.CONVERTIBLE),
-                new TestData("square-kilometer-per-second", "second-per-square-meter", UnitConverter.Convertibility.RECIPROCAL),
-                new TestData("cubic-kilometer-per-second-meter", "second-per-square-meter", UnitConverter.Convertibility.RECIPROCAL),
-                new TestData("square-meter-per-square-hour", "hectare-per-square-second", UnitConverter.Convertibility.CONVERTIBLE),
-                new TestData("hertz", "revolution-per-second", UnitConverter.Convertibility.CONVERTIBLE),
-                new TestData("millimeter", "meter", UnitConverter.Convertibility.CONVERTIBLE),
-                new TestData("yard", "meter", UnitConverter.Convertibility.CONVERTIBLE),
-                new TestData("ounce-troy", "kilogram", UnitConverter.Convertibility.CONVERTIBLE),
-                new TestData("percent", "portion", UnitConverter.Convertibility.CONVERTIBLE),
-                new TestData("ofhg", "kilogram-per-square-meter-square-second", UnitConverter.Convertibility.CONVERTIBLE),
-                new TestData("second-per-meter", "meter-per-second", UnitConverter.Convertibility.RECIPROCAL),
+                new TestData("meter", "foot", UnitsConverter.Convertibility.CONVERTIBLE),
+                new TestData("kilometer", "foot", UnitsConverter.Convertibility.CONVERTIBLE),
+                new TestData("hectare", "square-foot", UnitsConverter.Convertibility.CONVERTIBLE),
+                new TestData("kilometer-per-second", "second-per-meter", UnitsConverter.Convertibility.RECIPROCAL),
+                new TestData("square-meter", "square-foot", UnitsConverter.Convertibility.CONVERTIBLE),
+                new TestData("kilometer-per-second", "foot-per-second", UnitsConverter.Convertibility.CONVERTIBLE),
+                new TestData("square-hectare", "pow4-foot", UnitsConverter.Convertibility.CONVERTIBLE),
+                new TestData("square-kilometer-per-second", "second-per-square-meter", UnitsConverter.Convertibility.RECIPROCAL),
+                new TestData("cubic-kilometer-per-second-meter", "second-per-square-meter", UnitsConverter.Convertibility.RECIPROCAL),
+                new TestData("square-meter-per-square-hour", "hectare-per-square-second", UnitsConverter.Convertibility.CONVERTIBLE),
+                new TestData("hertz", "revolution-per-second", UnitsConverter.Convertibility.CONVERTIBLE),
+                new TestData("millimeter", "meter", UnitsConverter.Convertibility.CONVERTIBLE),
+                new TestData("yard", "meter", UnitsConverter.Convertibility.CONVERTIBLE),
+                new TestData("ounce-troy", "kilogram", UnitsConverter.Convertibility.CONVERTIBLE),
+                new TestData("percent", "portion", UnitsConverter.Convertibility.CONVERTIBLE),
+                new TestData("ofhg", "kilogram-per-square-meter-square-second", UnitsConverter.Convertibility.CONVERTIBLE),
+                new TestData("second-per-meter", "meter-per-second", UnitsConverter.Convertibility.RECIPROCAL),
         };
         ConversionRates conversionRates = new ConversionRates();
 
         for (TestData test :
                 tests) {
-            assertEquals(test.expected, UnitConverter.extractConvertibility(test.source, test.target, conversionRates));
+            assertEquals(test.expected, UnitsConverter.extractConvertibility(test.source, test.target, conversionRates));
         }
     }
 
@@ -340,7 +340,7 @@
 
         ConversionRates conversionRates = new ConversionRates();
         for (TestData test : tests) {
-            UnitConverter converter = new UnitConverter(test.source, test.target, conversionRates);
+            UnitsConverter converter = new UnitsConverter(test.source, test.target, conversionRates);
             double maxDelta = 1e-6 * Math.abs(test.expected.doubleValue());
             if (test.expected.doubleValue() == 0) {
                 maxDelta = 1e-12;
@@ -394,7 +394,7 @@
 
         for (TestCase testCase :
                 tests) {
-            UnitConverter converter = new UnitConverter(testCase.source, testCase.target, conversionRates);
+            UnitsConverter converter = new UnitsConverter(testCase.source, testCase.target, conversionRates);
             BigDecimal got = converter.convert(testCase.input);
             if (compareTwoBigDecimal(testCase.expected, got, BigDecimal.valueOf(0.000001))) {
                 continue;