ICU-20337 Adding value getters to C++ MeasureUnit API.

ICU-20337 Restoring comments in MeasureUnitTest.java
diff --git a/icu4c/source/i18n/measunit.cpp b/icu4c/source/i18n/measunit.cpp
index d68d504..a0c30b4 100644
--- a/icu4c/source/i18n/measunit.cpp
+++ b/icu4c/source/i18n/measunit.cpp
@@ -571,558 +571,1114 @@
     return MeasureUnit::create(0, 0, status);
 }
 
+MeasureUnit MeasureUnit::getGForce() {
+    return MeasureUnit(0, 0);
+}
+
 MeasureUnit *MeasureUnit::createMeterPerSecondSquared(UErrorCode &status) {
     return MeasureUnit::create(0, 1, status);
 }
 
+MeasureUnit MeasureUnit::getMeterPerSecondSquared() {
+    return MeasureUnit(0, 1);
+}
+
 MeasureUnit *MeasureUnit::createArcMinute(UErrorCode &status) {
     return MeasureUnit::create(1, 0, status);
 }
 
+MeasureUnit MeasureUnit::getArcMinute() {
+    return MeasureUnit(1, 0);
+}
+
 MeasureUnit *MeasureUnit::createArcSecond(UErrorCode &status) {
     return MeasureUnit::create(1, 1, status);
 }
 
+MeasureUnit MeasureUnit::getArcSecond() {
+    return MeasureUnit(1, 1);
+}
+
 MeasureUnit *MeasureUnit::createDegree(UErrorCode &status) {
     return MeasureUnit::create(1, 2, status);
 }
 
+MeasureUnit MeasureUnit::getDegree() {
+    return MeasureUnit(1, 2);
+}
+
 MeasureUnit *MeasureUnit::createRadian(UErrorCode &status) {
     return MeasureUnit::create(1, 3, status);
 }
 
+MeasureUnit MeasureUnit::getRadian() {
+    return MeasureUnit(1, 3);
+}
+
 MeasureUnit *MeasureUnit::createRevolutionAngle(UErrorCode &status) {
     return MeasureUnit::create(1, 4, status);
 }
 
+MeasureUnit MeasureUnit::getRevolutionAngle() {
+    return MeasureUnit(1, 4);
+}
+
 MeasureUnit *MeasureUnit::createAcre(UErrorCode &status) {
     return MeasureUnit::create(2, 0, status);
 }
 
+MeasureUnit MeasureUnit::getAcre() {
+    return MeasureUnit(2, 0);
+}
+
 MeasureUnit *MeasureUnit::createHectare(UErrorCode &status) {
     return MeasureUnit::create(2, 1, status);
 }
 
+MeasureUnit MeasureUnit::getHectare() {
+    return MeasureUnit(2, 1);
+}
+
 MeasureUnit *MeasureUnit::createSquareCentimeter(UErrorCode &status) {
     return MeasureUnit::create(2, 2, status);
 }
 
+MeasureUnit MeasureUnit::getSquareCentimeter() {
+    return MeasureUnit(2, 2);
+}
+
 MeasureUnit *MeasureUnit::createSquareFoot(UErrorCode &status) {
     return MeasureUnit::create(2, 3, status);
 }
 
+MeasureUnit MeasureUnit::getSquareFoot() {
+    return MeasureUnit(2, 3);
+}
+
 MeasureUnit *MeasureUnit::createSquareInch(UErrorCode &status) {
     return MeasureUnit::create(2, 4, status);
 }
 
+MeasureUnit MeasureUnit::getSquareInch() {
+    return MeasureUnit(2, 4);
+}
+
 MeasureUnit *MeasureUnit::createSquareKilometer(UErrorCode &status) {
     return MeasureUnit::create(2, 5, status);
 }
 
+MeasureUnit MeasureUnit::getSquareKilometer() {
+    return MeasureUnit(2, 5);
+}
+
 MeasureUnit *MeasureUnit::createSquareMeter(UErrorCode &status) {
     return MeasureUnit::create(2, 6, status);
 }
 
+MeasureUnit MeasureUnit::getSquareMeter() {
+    return MeasureUnit(2, 6);
+}
+
 MeasureUnit *MeasureUnit::createSquareMile(UErrorCode &status) {
     return MeasureUnit::create(2, 7, status);
 }
 
+MeasureUnit MeasureUnit::getSquareMile() {
+    return MeasureUnit(2, 7);
+}
+
 MeasureUnit *MeasureUnit::createSquareYard(UErrorCode &status) {
     return MeasureUnit::create(2, 8, status);
 }
 
+MeasureUnit MeasureUnit::getSquareYard() {
+    return MeasureUnit(2, 8);
+}
+
 MeasureUnit *MeasureUnit::createKarat(UErrorCode &status) {
     return MeasureUnit::create(3, 0, status);
 }
 
+MeasureUnit MeasureUnit::getKarat() {
+    return MeasureUnit(3, 0);
+}
+
 MeasureUnit *MeasureUnit::createMilligramPerDeciliter(UErrorCode &status) {
     return MeasureUnit::create(3, 1, status);
 }
 
+MeasureUnit MeasureUnit::getMilligramPerDeciliter() {
+    return MeasureUnit(3, 1);
+}
+
 MeasureUnit *MeasureUnit::createMillimolePerLiter(UErrorCode &status) {
     return MeasureUnit::create(3, 2, status);
 }
 
+MeasureUnit MeasureUnit::getMillimolePerLiter() {
+    return MeasureUnit(3, 2);
+}
+
 MeasureUnit *MeasureUnit::createPartPerMillion(UErrorCode &status) {
     return MeasureUnit::create(3, 3, status);
 }
 
+MeasureUnit MeasureUnit::getPartPerMillion() {
+    return MeasureUnit(3, 3);
+}
+
 MeasureUnit *MeasureUnit::createPercent(UErrorCode &status) {
     return MeasureUnit::create(3, 4, status);
 }
 
+MeasureUnit MeasureUnit::getPercent() {
+    return MeasureUnit(3, 4);
+}
+
 MeasureUnit *MeasureUnit::createPermille(UErrorCode &status) {
     return MeasureUnit::create(3, 5, status);
 }
 
+MeasureUnit MeasureUnit::getPermille() {
+    return MeasureUnit(3, 5);
+}
+
 MeasureUnit *MeasureUnit::createLiterPer100Kilometers(UErrorCode &status) {
     return MeasureUnit::create(4, 0, status);
 }
 
+MeasureUnit MeasureUnit::getLiterPer100Kilometers() {
+    return MeasureUnit(4, 0);
+}
+
 MeasureUnit *MeasureUnit::createLiterPerKilometer(UErrorCode &status) {
     return MeasureUnit::create(4, 1, status);
 }
 
+MeasureUnit MeasureUnit::getLiterPerKilometer() {
+    return MeasureUnit(4, 1);
+}
+
 MeasureUnit *MeasureUnit::createMilePerGallon(UErrorCode &status) {
     return MeasureUnit::create(4, 2, status);
 }
 
+MeasureUnit MeasureUnit::getMilePerGallon() {
+    return MeasureUnit(4, 2);
+}
+
 MeasureUnit *MeasureUnit::createMilePerGallonImperial(UErrorCode &status) {
     return MeasureUnit::create(4, 3, status);
 }
 
+MeasureUnit MeasureUnit::getMilePerGallonImperial() {
+    return MeasureUnit(4, 3);
+}
+
 MeasureUnit *MeasureUnit::createBit(UErrorCode &status) {
     return MeasureUnit::create(6, 0, status);
 }
 
+MeasureUnit MeasureUnit::getBit() {
+    return MeasureUnit(6, 0);
+}
+
 MeasureUnit *MeasureUnit::createByte(UErrorCode &status) {
     return MeasureUnit::create(6, 1, status);
 }
 
+MeasureUnit MeasureUnit::getByte() {
+    return MeasureUnit(6, 1);
+}
+
 MeasureUnit *MeasureUnit::createGigabit(UErrorCode &status) {
     return MeasureUnit::create(6, 2, status);
 }
 
+MeasureUnit MeasureUnit::getGigabit() {
+    return MeasureUnit(6, 2);
+}
+
 MeasureUnit *MeasureUnit::createGigabyte(UErrorCode &status) {
     return MeasureUnit::create(6, 3, status);
 }
 
+MeasureUnit MeasureUnit::getGigabyte() {
+    return MeasureUnit(6, 3);
+}
+
 MeasureUnit *MeasureUnit::createKilobit(UErrorCode &status) {
     return MeasureUnit::create(6, 4, status);
 }
 
+MeasureUnit MeasureUnit::getKilobit() {
+    return MeasureUnit(6, 4);
+}
+
 MeasureUnit *MeasureUnit::createKilobyte(UErrorCode &status) {
     return MeasureUnit::create(6, 5, status);
 }
 
+MeasureUnit MeasureUnit::getKilobyte() {
+    return MeasureUnit(6, 5);
+}
+
 MeasureUnit *MeasureUnit::createMegabit(UErrorCode &status) {
     return MeasureUnit::create(6, 6, status);
 }
 
+MeasureUnit MeasureUnit::getMegabit() {
+    return MeasureUnit(6, 6);
+}
+
 MeasureUnit *MeasureUnit::createMegabyte(UErrorCode &status) {
     return MeasureUnit::create(6, 7, status);
 }
 
+MeasureUnit MeasureUnit::getMegabyte() {
+    return MeasureUnit(6, 7);
+}
+
 MeasureUnit *MeasureUnit::createPetabyte(UErrorCode &status) {
     return MeasureUnit::create(6, 8, status);
 }
 
+MeasureUnit MeasureUnit::getPetabyte() {
+    return MeasureUnit(6, 8);
+}
+
 MeasureUnit *MeasureUnit::createTerabit(UErrorCode &status) {
     return MeasureUnit::create(6, 9, status);
 }
 
+MeasureUnit MeasureUnit::getTerabit() {
+    return MeasureUnit(6, 9);
+}
+
 MeasureUnit *MeasureUnit::createTerabyte(UErrorCode &status) {
     return MeasureUnit::create(6, 10, status);
 }
 
+MeasureUnit MeasureUnit::getTerabyte() {
+    return MeasureUnit(6, 10);
+}
+
 MeasureUnit *MeasureUnit::createCentury(UErrorCode &status) {
     return MeasureUnit::create(7, 0, status);
 }
 
+MeasureUnit MeasureUnit::getCentury() {
+    return MeasureUnit(7, 0);
+}
+
 MeasureUnit *MeasureUnit::createDay(UErrorCode &status) {
     return MeasureUnit::create(7, 1, status);
 }
 
+MeasureUnit MeasureUnit::getDay() {
+    return MeasureUnit(7, 1);
+}
+
 MeasureUnit *MeasureUnit::createHour(UErrorCode &status) {
     return MeasureUnit::create(7, 2, status);
 }
 
+MeasureUnit MeasureUnit::getHour() {
+    return MeasureUnit(7, 2);
+}
+
 MeasureUnit *MeasureUnit::createMicrosecond(UErrorCode &status) {
     return MeasureUnit::create(7, 3, status);
 }
 
+MeasureUnit MeasureUnit::getMicrosecond() {
+    return MeasureUnit(7, 3);
+}
+
 MeasureUnit *MeasureUnit::createMillisecond(UErrorCode &status) {
     return MeasureUnit::create(7, 4, status);
 }
 
+MeasureUnit MeasureUnit::getMillisecond() {
+    return MeasureUnit(7, 4);
+}
+
 MeasureUnit *MeasureUnit::createMinute(UErrorCode &status) {
     return MeasureUnit::create(7, 5, status);
 }
 
+MeasureUnit MeasureUnit::getMinute() {
+    return MeasureUnit(7, 5);
+}
+
 MeasureUnit *MeasureUnit::createMonth(UErrorCode &status) {
     return MeasureUnit::create(7, 6, status);
 }
 
+MeasureUnit MeasureUnit::getMonth() {
+    return MeasureUnit(7, 6);
+}
+
 MeasureUnit *MeasureUnit::createNanosecond(UErrorCode &status) {
     return MeasureUnit::create(7, 7, status);
 }
 
+MeasureUnit MeasureUnit::getNanosecond() {
+    return MeasureUnit(7, 7);
+}
+
 MeasureUnit *MeasureUnit::createSecond(UErrorCode &status) {
     return MeasureUnit::create(7, 8, status);
 }
 
+MeasureUnit MeasureUnit::getSecond() {
+    return MeasureUnit(7, 8);
+}
+
 MeasureUnit *MeasureUnit::createWeek(UErrorCode &status) {
     return MeasureUnit::create(7, 9, status);
 }
 
+MeasureUnit MeasureUnit::getWeek() {
+    return MeasureUnit(7, 9);
+}
+
 MeasureUnit *MeasureUnit::createYear(UErrorCode &status) {
     return MeasureUnit::create(7, 10, status);
 }
 
+MeasureUnit MeasureUnit::getYear() {
+    return MeasureUnit(7, 10);
+}
+
 MeasureUnit *MeasureUnit::createAmpere(UErrorCode &status) {
     return MeasureUnit::create(8, 0, status);
 }
 
+MeasureUnit MeasureUnit::getAmpere() {
+    return MeasureUnit(8, 0);
+}
+
 MeasureUnit *MeasureUnit::createMilliampere(UErrorCode &status) {
     return MeasureUnit::create(8, 1, status);
 }
 
+MeasureUnit MeasureUnit::getMilliampere() {
+    return MeasureUnit(8, 1);
+}
+
 MeasureUnit *MeasureUnit::createOhm(UErrorCode &status) {
     return MeasureUnit::create(8, 2, status);
 }
 
+MeasureUnit MeasureUnit::getOhm() {
+    return MeasureUnit(8, 2);
+}
+
 MeasureUnit *MeasureUnit::createVolt(UErrorCode &status) {
     return MeasureUnit::create(8, 3, status);
 }
 
+MeasureUnit MeasureUnit::getVolt() {
+    return MeasureUnit(8, 3);
+}
+
 MeasureUnit *MeasureUnit::createCalorie(UErrorCode &status) {
     return MeasureUnit::create(9, 0, status);
 }
 
+MeasureUnit MeasureUnit::getCalorie() {
+    return MeasureUnit(9, 0);
+}
+
 MeasureUnit *MeasureUnit::createFoodcalorie(UErrorCode &status) {
     return MeasureUnit::create(9, 1, status);
 }
 
+MeasureUnit MeasureUnit::getFoodcalorie() {
+    return MeasureUnit(9, 1);
+}
+
 MeasureUnit *MeasureUnit::createJoule(UErrorCode &status) {
     return MeasureUnit::create(9, 2, status);
 }
 
+MeasureUnit MeasureUnit::getJoule() {
+    return MeasureUnit(9, 2);
+}
+
 MeasureUnit *MeasureUnit::createKilocalorie(UErrorCode &status) {
     return MeasureUnit::create(9, 3, status);
 }
 
+MeasureUnit MeasureUnit::getKilocalorie() {
+    return MeasureUnit(9, 3);
+}
+
 MeasureUnit *MeasureUnit::createKilojoule(UErrorCode &status) {
     return MeasureUnit::create(9, 4, status);
 }
 
+MeasureUnit MeasureUnit::getKilojoule() {
+    return MeasureUnit(9, 4);
+}
+
 MeasureUnit *MeasureUnit::createKilowattHour(UErrorCode &status) {
     return MeasureUnit::create(9, 5, status);
 }
 
+MeasureUnit MeasureUnit::getKilowattHour() {
+    return MeasureUnit(9, 5);
+}
+
 MeasureUnit *MeasureUnit::createGigahertz(UErrorCode &status) {
     return MeasureUnit::create(10, 0, status);
 }
 
+MeasureUnit MeasureUnit::getGigahertz() {
+    return MeasureUnit(10, 0);
+}
+
 MeasureUnit *MeasureUnit::createHertz(UErrorCode &status) {
     return MeasureUnit::create(10, 1, status);
 }
 
+MeasureUnit MeasureUnit::getHertz() {
+    return MeasureUnit(10, 1);
+}
+
 MeasureUnit *MeasureUnit::createKilohertz(UErrorCode &status) {
     return MeasureUnit::create(10, 2, status);
 }
 
+MeasureUnit MeasureUnit::getKilohertz() {
+    return MeasureUnit(10, 2);
+}
+
 MeasureUnit *MeasureUnit::createMegahertz(UErrorCode &status) {
     return MeasureUnit::create(10, 3, status);
 }
 
+MeasureUnit MeasureUnit::getMegahertz() {
+    return MeasureUnit(10, 3);
+}
+
 MeasureUnit *MeasureUnit::createAstronomicalUnit(UErrorCode &status) {
     return MeasureUnit::create(11, 0, status);
 }
 
+MeasureUnit MeasureUnit::getAstronomicalUnit() {
+    return MeasureUnit(11, 0);
+}
+
 MeasureUnit *MeasureUnit::createCentimeter(UErrorCode &status) {
     return MeasureUnit::create(11, 1, status);
 }
 
+MeasureUnit MeasureUnit::getCentimeter() {
+    return MeasureUnit(11, 1);
+}
+
 MeasureUnit *MeasureUnit::createDecimeter(UErrorCode &status) {
     return MeasureUnit::create(11, 2, status);
 }
 
+MeasureUnit MeasureUnit::getDecimeter() {
+    return MeasureUnit(11, 2);
+}
+
 MeasureUnit *MeasureUnit::createFathom(UErrorCode &status) {
     return MeasureUnit::create(11, 3, status);
 }
 
+MeasureUnit MeasureUnit::getFathom() {
+    return MeasureUnit(11, 3);
+}
+
 MeasureUnit *MeasureUnit::createFoot(UErrorCode &status) {
     return MeasureUnit::create(11, 4, status);
 }
 
+MeasureUnit MeasureUnit::getFoot() {
+    return MeasureUnit(11, 4);
+}
+
 MeasureUnit *MeasureUnit::createFurlong(UErrorCode &status) {
     return MeasureUnit::create(11, 5, status);
 }
 
+MeasureUnit MeasureUnit::getFurlong() {
+    return MeasureUnit(11, 5);
+}
+
 MeasureUnit *MeasureUnit::createInch(UErrorCode &status) {
     return MeasureUnit::create(11, 6, status);
 }
 
+MeasureUnit MeasureUnit::getInch() {
+    return MeasureUnit(11, 6);
+}
+
 MeasureUnit *MeasureUnit::createKilometer(UErrorCode &status) {
     return MeasureUnit::create(11, 7, status);
 }
 
+MeasureUnit MeasureUnit::getKilometer() {
+    return MeasureUnit(11, 7);
+}
+
 MeasureUnit *MeasureUnit::createLightYear(UErrorCode &status) {
     return MeasureUnit::create(11, 8, status);
 }
 
+MeasureUnit MeasureUnit::getLightYear() {
+    return MeasureUnit(11, 8);
+}
+
 MeasureUnit *MeasureUnit::createMeter(UErrorCode &status) {
     return MeasureUnit::create(11, 9, status);
 }
 
+MeasureUnit MeasureUnit::getMeter() {
+    return MeasureUnit(11, 9);
+}
+
 MeasureUnit *MeasureUnit::createMicrometer(UErrorCode &status) {
     return MeasureUnit::create(11, 10, status);
 }
 
+MeasureUnit MeasureUnit::getMicrometer() {
+    return MeasureUnit(11, 10);
+}
+
 MeasureUnit *MeasureUnit::createMile(UErrorCode &status) {
     return MeasureUnit::create(11, 11, status);
 }
 
+MeasureUnit MeasureUnit::getMile() {
+    return MeasureUnit(11, 11);
+}
+
 MeasureUnit *MeasureUnit::createMileScandinavian(UErrorCode &status) {
     return MeasureUnit::create(11, 12, status);
 }
 
+MeasureUnit MeasureUnit::getMileScandinavian() {
+    return MeasureUnit(11, 12);
+}
+
 MeasureUnit *MeasureUnit::createMillimeter(UErrorCode &status) {
     return MeasureUnit::create(11, 13, status);
 }
 
+MeasureUnit MeasureUnit::getMillimeter() {
+    return MeasureUnit(11, 13);
+}
+
 MeasureUnit *MeasureUnit::createNanometer(UErrorCode &status) {
     return MeasureUnit::create(11, 14, status);
 }
 
+MeasureUnit MeasureUnit::getNanometer() {
+    return MeasureUnit(11, 14);
+}
+
 MeasureUnit *MeasureUnit::createNauticalMile(UErrorCode &status) {
     return MeasureUnit::create(11, 15, status);
 }
 
+MeasureUnit MeasureUnit::getNauticalMile() {
+    return MeasureUnit(11, 15);
+}
+
 MeasureUnit *MeasureUnit::createParsec(UErrorCode &status) {
     return MeasureUnit::create(11, 16, status);
 }
 
+MeasureUnit MeasureUnit::getParsec() {
+    return MeasureUnit(11, 16);
+}
+
 MeasureUnit *MeasureUnit::createPicometer(UErrorCode &status) {
     return MeasureUnit::create(11, 17, status);
 }
 
+MeasureUnit MeasureUnit::getPicometer() {
+    return MeasureUnit(11, 17);
+}
+
 MeasureUnit *MeasureUnit::createPoint(UErrorCode &status) {
     return MeasureUnit::create(11, 18, status);
 }
 
+MeasureUnit MeasureUnit::getPoint() {
+    return MeasureUnit(11, 18);
+}
+
 MeasureUnit *MeasureUnit::createYard(UErrorCode &status) {
     return MeasureUnit::create(11, 19, status);
 }
 
+MeasureUnit MeasureUnit::getYard() {
+    return MeasureUnit(11, 19);
+}
+
 MeasureUnit *MeasureUnit::createLux(UErrorCode &status) {
     return MeasureUnit::create(12, 0, status);
 }
 
+MeasureUnit MeasureUnit::getLux() {
+    return MeasureUnit(12, 0);
+}
+
 MeasureUnit *MeasureUnit::createCarat(UErrorCode &status) {
     return MeasureUnit::create(13, 0, status);
 }
 
+MeasureUnit MeasureUnit::getCarat() {
+    return MeasureUnit(13, 0);
+}
+
 MeasureUnit *MeasureUnit::createGram(UErrorCode &status) {
     return MeasureUnit::create(13, 1, status);
 }
 
+MeasureUnit MeasureUnit::getGram() {
+    return MeasureUnit(13, 1);
+}
+
 MeasureUnit *MeasureUnit::createKilogram(UErrorCode &status) {
     return MeasureUnit::create(13, 2, status);
 }
 
+MeasureUnit MeasureUnit::getKilogram() {
+    return MeasureUnit(13, 2);
+}
+
 MeasureUnit *MeasureUnit::createMetricTon(UErrorCode &status) {
     return MeasureUnit::create(13, 3, status);
 }
 
+MeasureUnit MeasureUnit::getMetricTon() {
+    return MeasureUnit(13, 3);
+}
+
 MeasureUnit *MeasureUnit::createMicrogram(UErrorCode &status) {
     return MeasureUnit::create(13, 4, status);
 }
 
+MeasureUnit MeasureUnit::getMicrogram() {
+    return MeasureUnit(13, 4);
+}
+
 MeasureUnit *MeasureUnit::createMilligram(UErrorCode &status) {
     return MeasureUnit::create(13, 5, status);
 }
 
+MeasureUnit MeasureUnit::getMilligram() {
+    return MeasureUnit(13, 5);
+}
+
 MeasureUnit *MeasureUnit::createOunce(UErrorCode &status) {
     return MeasureUnit::create(13, 6, status);
 }
 
+MeasureUnit MeasureUnit::getOunce() {
+    return MeasureUnit(13, 6);
+}
+
 MeasureUnit *MeasureUnit::createOunceTroy(UErrorCode &status) {
     return MeasureUnit::create(13, 7, status);
 }
 
+MeasureUnit MeasureUnit::getOunceTroy() {
+    return MeasureUnit(13, 7);
+}
+
 MeasureUnit *MeasureUnit::createPound(UErrorCode &status) {
     return MeasureUnit::create(13, 8, status);
 }
 
+MeasureUnit MeasureUnit::getPound() {
+    return MeasureUnit(13, 8);
+}
+
 MeasureUnit *MeasureUnit::createStone(UErrorCode &status) {
     return MeasureUnit::create(13, 9, status);
 }
 
+MeasureUnit MeasureUnit::getStone() {
+    return MeasureUnit(13, 9);
+}
+
 MeasureUnit *MeasureUnit::createTon(UErrorCode &status) {
     return MeasureUnit::create(13, 10, status);
 }
 
+MeasureUnit MeasureUnit::getTon() {
+    return MeasureUnit(13, 10);
+}
+
 MeasureUnit *MeasureUnit::createGigawatt(UErrorCode &status) {
     return MeasureUnit::create(15, 0, status);
 }
 
+MeasureUnit MeasureUnit::getGigawatt() {
+    return MeasureUnit(15, 0);
+}
+
 MeasureUnit *MeasureUnit::createHorsepower(UErrorCode &status) {
     return MeasureUnit::create(15, 1, status);
 }
 
+MeasureUnit MeasureUnit::getHorsepower() {
+    return MeasureUnit(15, 1);
+}
+
 MeasureUnit *MeasureUnit::createKilowatt(UErrorCode &status) {
     return MeasureUnit::create(15, 2, status);
 }
 
+MeasureUnit MeasureUnit::getKilowatt() {
+    return MeasureUnit(15, 2);
+}
+
 MeasureUnit *MeasureUnit::createMegawatt(UErrorCode &status) {
     return MeasureUnit::create(15, 3, status);
 }
 
+MeasureUnit MeasureUnit::getMegawatt() {
+    return MeasureUnit(15, 3);
+}
+
 MeasureUnit *MeasureUnit::createMilliwatt(UErrorCode &status) {
     return MeasureUnit::create(15, 4, status);
 }
 
+MeasureUnit MeasureUnit::getMilliwatt() {
+    return MeasureUnit(15, 4);
+}
+
 MeasureUnit *MeasureUnit::createWatt(UErrorCode &status) {
     return MeasureUnit::create(15, 5, status);
 }
 
+MeasureUnit MeasureUnit::getWatt() {
+    return MeasureUnit(15, 5);
+}
+
 MeasureUnit *MeasureUnit::createAtmosphere(UErrorCode &status) {
     return MeasureUnit::create(16, 0, status);
 }
 
+MeasureUnit MeasureUnit::getAtmosphere() {
+    return MeasureUnit(16, 0);
+}
+
 MeasureUnit *MeasureUnit::createHectopascal(UErrorCode &status) {
     return MeasureUnit::create(16, 1, status);
 }
 
+MeasureUnit MeasureUnit::getHectopascal() {
+    return MeasureUnit(16, 1);
+}
+
 MeasureUnit *MeasureUnit::createInchHg(UErrorCode &status) {
     return MeasureUnit::create(16, 2, status);
 }
 
+MeasureUnit MeasureUnit::getInchHg() {
+    return MeasureUnit(16, 2);
+}
+
 MeasureUnit *MeasureUnit::createMillibar(UErrorCode &status) {
     return MeasureUnit::create(16, 3, status);
 }
 
+MeasureUnit MeasureUnit::getMillibar() {
+    return MeasureUnit(16, 3);
+}
+
 MeasureUnit *MeasureUnit::createMillimeterOfMercury(UErrorCode &status) {
     return MeasureUnit::create(16, 4, status);
 }
 
+MeasureUnit MeasureUnit::getMillimeterOfMercury() {
+    return MeasureUnit(16, 4);
+}
+
 MeasureUnit *MeasureUnit::createPoundPerSquareInch(UErrorCode &status) {
     return MeasureUnit::create(16, 5, status);
 }
 
+MeasureUnit MeasureUnit::getPoundPerSquareInch() {
+    return MeasureUnit(16, 5);
+}
+
 MeasureUnit *MeasureUnit::createKilometerPerHour(UErrorCode &status) {
     return MeasureUnit::create(17, 0, status);
 }
 
+MeasureUnit MeasureUnit::getKilometerPerHour() {
+    return MeasureUnit(17, 0);
+}
+
 MeasureUnit *MeasureUnit::createKnot(UErrorCode &status) {
     return MeasureUnit::create(17, 1, status);
 }
 
+MeasureUnit MeasureUnit::getKnot() {
+    return MeasureUnit(17, 1);
+}
+
 MeasureUnit *MeasureUnit::createMeterPerSecond(UErrorCode &status) {
     return MeasureUnit::create(17, 2, status);
 }
 
+MeasureUnit MeasureUnit::getMeterPerSecond() {
+    return MeasureUnit(17, 2);
+}
+
 MeasureUnit *MeasureUnit::createMilePerHour(UErrorCode &status) {
     return MeasureUnit::create(17, 3, status);
 }
 
+MeasureUnit MeasureUnit::getMilePerHour() {
+    return MeasureUnit(17, 3);
+}
+
 MeasureUnit *MeasureUnit::createCelsius(UErrorCode &status) {
     return MeasureUnit::create(18, 0, status);
 }
 
+MeasureUnit MeasureUnit::getCelsius() {
+    return MeasureUnit(18, 0);
+}
+
 MeasureUnit *MeasureUnit::createFahrenheit(UErrorCode &status) {
     return MeasureUnit::create(18, 1, status);
 }
 
+MeasureUnit MeasureUnit::getFahrenheit() {
+    return MeasureUnit(18, 1);
+}
+
 MeasureUnit *MeasureUnit::createGenericTemperature(UErrorCode &status) {
     return MeasureUnit::create(18, 2, status);
 }
 
+MeasureUnit MeasureUnit::getGenericTemperature() {
+    return MeasureUnit(18, 2);
+}
+
 MeasureUnit *MeasureUnit::createKelvin(UErrorCode &status) {
     return MeasureUnit::create(18, 3, status);
 }
 
+MeasureUnit MeasureUnit::getKelvin() {
+    return MeasureUnit(18, 3);
+}
+
 MeasureUnit *MeasureUnit::createAcreFoot(UErrorCode &status) {
     return MeasureUnit::create(19, 0, status);
 }
 
+MeasureUnit MeasureUnit::getAcreFoot() {
+    return MeasureUnit(19, 0);
+}
+
 MeasureUnit *MeasureUnit::createBushel(UErrorCode &status) {
     return MeasureUnit::create(19, 1, status);
 }
 
+MeasureUnit MeasureUnit::getBushel() {
+    return MeasureUnit(19, 1);
+}
+
 MeasureUnit *MeasureUnit::createCentiliter(UErrorCode &status) {
     return MeasureUnit::create(19, 2, status);
 }
 
+MeasureUnit MeasureUnit::getCentiliter() {
+    return MeasureUnit(19, 2);
+}
+
 MeasureUnit *MeasureUnit::createCubicCentimeter(UErrorCode &status) {
     return MeasureUnit::create(19, 3, status);
 }
 
+MeasureUnit MeasureUnit::getCubicCentimeter() {
+    return MeasureUnit(19, 3);
+}
+
 MeasureUnit *MeasureUnit::createCubicFoot(UErrorCode &status) {
     return MeasureUnit::create(19, 4, status);
 }
 
+MeasureUnit MeasureUnit::getCubicFoot() {
+    return MeasureUnit(19, 4);
+}
+
 MeasureUnit *MeasureUnit::createCubicInch(UErrorCode &status) {
     return MeasureUnit::create(19, 5, status);
 }
 
+MeasureUnit MeasureUnit::getCubicInch() {
+    return MeasureUnit(19, 5);
+}
+
 MeasureUnit *MeasureUnit::createCubicKilometer(UErrorCode &status) {
     return MeasureUnit::create(19, 6, status);
 }
 
+MeasureUnit MeasureUnit::getCubicKilometer() {
+    return MeasureUnit(19, 6);
+}
+
 MeasureUnit *MeasureUnit::createCubicMeter(UErrorCode &status) {
     return MeasureUnit::create(19, 7, status);
 }
 
+MeasureUnit MeasureUnit::getCubicMeter() {
+    return MeasureUnit(19, 7);
+}
+
 MeasureUnit *MeasureUnit::createCubicMile(UErrorCode &status) {
     return MeasureUnit::create(19, 8, status);
 }
 
+MeasureUnit MeasureUnit::getCubicMile() {
+    return MeasureUnit(19, 8);
+}
+
 MeasureUnit *MeasureUnit::createCubicYard(UErrorCode &status) {
     return MeasureUnit::create(19, 9, status);
 }
 
+MeasureUnit MeasureUnit::getCubicYard() {
+    return MeasureUnit(19, 9);
+}
+
 MeasureUnit *MeasureUnit::createCup(UErrorCode &status) {
     return MeasureUnit::create(19, 10, status);
 }
 
+MeasureUnit MeasureUnit::getCup() {
+    return MeasureUnit(19, 10);
+}
+
 MeasureUnit *MeasureUnit::createCupMetric(UErrorCode &status) {
     return MeasureUnit::create(19, 11, status);
 }
 
+MeasureUnit MeasureUnit::getCupMetric() {
+    return MeasureUnit(19, 11);
+}
+
 MeasureUnit *MeasureUnit::createDeciliter(UErrorCode &status) {
     return MeasureUnit::create(19, 12, status);
 }
 
+MeasureUnit MeasureUnit::getDeciliter() {
+    return MeasureUnit(19, 12);
+}
+
 MeasureUnit *MeasureUnit::createFluidOunce(UErrorCode &status) {
     return MeasureUnit::create(19, 13, status);
 }
 
+MeasureUnit MeasureUnit::getFluidOunce() {
+    return MeasureUnit(19, 13);
+}
+
 MeasureUnit *MeasureUnit::createGallon(UErrorCode &status) {
     return MeasureUnit::create(19, 14, status);
 }
 
+MeasureUnit MeasureUnit::getGallon() {
+    return MeasureUnit(19, 14);
+}
+
 MeasureUnit *MeasureUnit::createGallonImperial(UErrorCode &status) {
     return MeasureUnit::create(19, 15, status);
 }
 
+MeasureUnit MeasureUnit::getGallonImperial() {
+    return MeasureUnit(19, 15);
+}
+
 MeasureUnit *MeasureUnit::createHectoliter(UErrorCode &status) {
     return MeasureUnit::create(19, 16, status);
 }
 
+MeasureUnit MeasureUnit::getHectoliter() {
+    return MeasureUnit(19, 16);
+}
+
 MeasureUnit *MeasureUnit::createLiter(UErrorCode &status) {
     return MeasureUnit::create(19, 17, status);
 }
 
+MeasureUnit MeasureUnit::getLiter() {
+    return MeasureUnit(19, 17);
+}
+
 MeasureUnit *MeasureUnit::createMegaliter(UErrorCode &status) {
     return MeasureUnit::create(19, 18, status);
 }
 
+MeasureUnit MeasureUnit::getMegaliter() {
+    return MeasureUnit(19, 18);
+}
+
 MeasureUnit *MeasureUnit::createMilliliter(UErrorCode &status) {
     return MeasureUnit::create(19, 19, status);
 }
 
+MeasureUnit MeasureUnit::getMilliliter() {
+    return MeasureUnit(19, 19);
+}
+
 MeasureUnit *MeasureUnit::createPint(UErrorCode &status) {
     return MeasureUnit::create(19, 20, status);
 }
 
+MeasureUnit MeasureUnit::getPint() {
+    return MeasureUnit(19, 20);
+}
+
 MeasureUnit *MeasureUnit::createPintMetric(UErrorCode &status) {
     return MeasureUnit::create(19, 21, status);
 }
 
+MeasureUnit MeasureUnit::getPintMetric() {
+    return MeasureUnit(19, 21);
+}
+
 MeasureUnit *MeasureUnit::createQuart(UErrorCode &status) {
     return MeasureUnit::create(19, 22, status);
 }
 
+MeasureUnit MeasureUnit::getQuart() {
+    return MeasureUnit(19, 22);
+}
+
 MeasureUnit *MeasureUnit::createTablespoon(UErrorCode &status) {
     return MeasureUnit::create(19, 23, status);
 }
 
+MeasureUnit MeasureUnit::getTablespoon() {
+    return MeasureUnit(19, 23);
+}
+
 MeasureUnit *MeasureUnit::createTeaspoon(UErrorCode &status) {
     return MeasureUnit::create(19, 24, status);
 }
 
+MeasureUnit MeasureUnit::getTeaspoon() {
+    return MeasureUnit(19, 24);
+}
+
 // End generated code
 
 static int32_t binarySearch(
diff --git a/icu4c/source/i18n/unicode/measunit.h b/icu4c/source/i18n/unicode/measunit.h
index fac18f7..c0406e1 100644
--- a/icu4c/source/i18n/unicode/measunit.h
+++ b/icu4c/source/i18n/unicode/measunit.h
@@ -209,1125 +209,2237 @@
 // Start generated createXXX methods
 
     /**
-     * Returns unit of acceleration: g-force.
+     * Returns by pointer, unit of acceleration: g-force.
      * Caller owns returned value and must free it.
+     * Also see {@link #getGForce()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createGForce(UErrorCode &status);
 
     /**
-     * Returns unit of acceleration: meter-per-second-squared.
+     * Returns by value, unit of acceleration: g-force.
+     * Also see {@link #createGForce()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getGForce();
+
+    /**
+     * Returns by pointer, unit of acceleration: meter-per-second-squared.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMeterPerSecondSquared()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createMeterPerSecondSquared(UErrorCode &status);
 
     /**
-     * Returns unit of angle: arc-minute.
+     * Returns by value, unit of acceleration: meter-per-second-squared.
+     * Also see {@link #createMeterPerSecondSquared()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMeterPerSecondSquared();
+
+    /**
+     * Returns by pointer, unit of angle: arc-minute.
      * Caller owns returned value and must free it.
+     * Also see {@link #getArcMinute()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createArcMinute(UErrorCode &status);
 
     /**
-     * Returns unit of angle: arc-second.
+     * Returns by value, unit of angle: arc-minute.
+     * Also see {@link #createArcMinute()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getArcMinute();
+
+    /**
+     * Returns by pointer, unit of angle: arc-second.
      * Caller owns returned value and must free it.
+     * Also see {@link #getArcSecond()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createArcSecond(UErrorCode &status);
 
     /**
-     * Returns unit of angle: degree.
+     * Returns by value, unit of angle: arc-second.
+     * Also see {@link #createArcSecond()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getArcSecond();
+
+    /**
+     * Returns by pointer, unit of angle: degree.
      * Caller owns returned value and must free it.
+     * Also see {@link #getDegree()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createDegree(UErrorCode &status);
 
     /**
-     * Returns unit of angle: radian.
+     * Returns by value, unit of angle: degree.
+     * Also see {@link #createDegree()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getDegree();
+
+    /**
+     * Returns by pointer, unit of angle: radian.
      * Caller owns returned value and must free it.
+     * Also see {@link #getRadian()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createRadian(UErrorCode &status);
 
     /**
-     * Returns unit of angle: revolution.
+     * Returns by value, unit of angle: radian.
+     * Also see {@link #createRadian()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getRadian();
+
+    /**
+     * Returns by pointer, unit of angle: revolution.
      * Caller owns returned value and must free it.
+     * Also see {@link #getRevolutionAngle()}.
      * @param status ICU error code.
      * @stable ICU 56
      */
     static MeasureUnit *createRevolutionAngle(UErrorCode &status);
 
     /**
-     * Returns unit of area: acre.
+     * Returns by value, unit of angle: revolution.
+     * Also see {@link #createRevolutionAngle()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getRevolutionAngle();
+
+    /**
+     * Returns by pointer, unit of area: acre.
      * Caller owns returned value and must free it.
+     * Also see {@link #getAcre()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createAcre(UErrorCode &status);
 
     /**
-     * Returns unit of area: hectare.
+     * Returns by value, unit of area: acre.
+     * Also see {@link #createAcre()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getAcre();
+
+    /**
+     * Returns by pointer, unit of area: hectare.
      * Caller owns returned value and must free it.
+     * Also see {@link #getHectare()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createHectare(UErrorCode &status);
 
     /**
-     * Returns unit of area: square-centimeter.
+     * Returns by value, unit of area: hectare.
+     * Also see {@link #createHectare()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getHectare();
+
+    /**
+     * Returns by pointer, unit of area: square-centimeter.
      * Caller owns returned value and must free it.
+     * Also see {@link #getSquareCentimeter()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createSquareCentimeter(UErrorCode &status);
 
     /**
-     * Returns unit of area: square-foot.
+     * Returns by value, unit of area: square-centimeter.
+     * Also see {@link #createSquareCentimeter()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getSquareCentimeter();
+
+    /**
+     * Returns by pointer, unit of area: square-foot.
      * Caller owns returned value and must free it.
+     * Also see {@link #getSquareFoot()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createSquareFoot(UErrorCode &status);
 
     /**
-     * Returns unit of area: square-inch.
+     * Returns by value, unit of area: square-foot.
+     * Also see {@link #createSquareFoot()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getSquareFoot();
+
+    /**
+     * Returns by pointer, unit of area: square-inch.
      * Caller owns returned value and must free it.
+     * Also see {@link #getSquareInch()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createSquareInch(UErrorCode &status);
 
     /**
-     * Returns unit of area: square-kilometer.
+     * Returns by value, unit of area: square-inch.
+     * Also see {@link #createSquareInch()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getSquareInch();
+
+    /**
+     * Returns by pointer, unit of area: square-kilometer.
      * Caller owns returned value and must free it.
+     * Also see {@link #getSquareKilometer()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createSquareKilometer(UErrorCode &status);
 
     /**
-     * Returns unit of area: square-meter.
+     * Returns by value, unit of area: square-kilometer.
+     * Also see {@link #createSquareKilometer()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getSquareKilometer();
+
+    /**
+     * Returns by pointer, unit of area: square-meter.
      * Caller owns returned value and must free it.
+     * Also see {@link #getSquareMeter()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createSquareMeter(UErrorCode &status);
 
     /**
-     * Returns unit of area: square-mile.
+     * Returns by value, unit of area: square-meter.
+     * Also see {@link #createSquareMeter()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getSquareMeter();
+
+    /**
+     * Returns by pointer, unit of area: square-mile.
      * Caller owns returned value and must free it.
+     * Also see {@link #getSquareMile()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createSquareMile(UErrorCode &status);
 
     /**
-     * Returns unit of area: square-yard.
+     * Returns by value, unit of area: square-mile.
+     * Also see {@link #createSquareMile()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getSquareMile();
+
+    /**
+     * Returns by pointer, unit of area: square-yard.
      * Caller owns returned value and must free it.
+     * Also see {@link #getSquareYard()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createSquareYard(UErrorCode &status);
 
     /**
-     * Returns unit of concentr: karat.
+     * Returns by value, unit of area: square-yard.
+     * Also see {@link #createSquareYard()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getSquareYard();
+
+    /**
+     * Returns by pointer, unit of concentr: karat.
      * Caller owns returned value and must free it.
+     * Also see {@link #getKarat()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createKarat(UErrorCode &status);
 
     /**
-     * Returns unit of concentr: milligram-per-deciliter.
+     * Returns by value, unit of concentr: karat.
+     * Also see {@link #createKarat()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getKarat();
+
+    /**
+     * Returns by pointer, unit of concentr: milligram-per-deciliter.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMilligramPerDeciliter()}.
      * @param status ICU error code.
      * @stable ICU 57
      */
     static MeasureUnit *createMilligramPerDeciliter(UErrorCode &status);
 
     /**
-     * Returns unit of concentr: millimole-per-liter.
+     * Returns by value, unit of concentr: milligram-per-deciliter.
+     * Also see {@link #createMilligramPerDeciliter()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMilligramPerDeciliter();
+
+    /**
+     * Returns by pointer, unit of concentr: millimole-per-liter.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMillimolePerLiter()}.
      * @param status ICU error code.
      * @stable ICU 57
      */
     static MeasureUnit *createMillimolePerLiter(UErrorCode &status);
 
     /**
-     * Returns unit of concentr: part-per-million.
+     * Returns by value, unit of concentr: millimole-per-liter.
+     * Also see {@link #createMillimolePerLiter()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMillimolePerLiter();
+
+    /**
+     * Returns by pointer, unit of concentr: part-per-million.
      * Caller owns returned value and must free it.
+     * Also see {@link #getPartPerMillion()}.
      * @param status ICU error code.
      * @stable ICU 57
      */
     static MeasureUnit *createPartPerMillion(UErrorCode &status);
 
+    /**
+     * Returns by value, unit of concentr: part-per-million.
+     * Also see {@link #createPartPerMillion()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getPartPerMillion();
+
 #ifndef U_HIDE_DRAFT_API
     /**
-     * Returns unit of concentr: percent.
+     * Returns by pointer, unit of concentr: percent.
      * Caller owns returned value and must free it.
+     * Also see {@link #getPercent()}.
      * @param status ICU error code.
      * @draft ICU 63
      */
     static MeasureUnit *createPercent(UErrorCode &status);
+
+    /**
+     * Returns by value, unit of concentr: percent.
+     * Also see {@link #createPercent()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getPercent();
 #endif /* U_HIDE_DRAFT_API */
 
 #ifndef U_HIDE_DRAFT_API
     /**
-     * Returns unit of concentr: permille.
+     * Returns by pointer, unit of concentr: permille.
      * Caller owns returned value and must free it.
+     * Also see {@link #getPermille()}.
      * @param status ICU error code.
      * @draft ICU 63
      */
     static MeasureUnit *createPermille(UErrorCode &status);
+
+    /**
+     * Returns by value, unit of concentr: permille.
+     * Also see {@link #createPermille()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getPermille();
 #endif /* U_HIDE_DRAFT_API */
 
     /**
-     * Returns unit of consumption: liter-per-100kilometers.
+     * Returns by pointer, unit of consumption: liter-per-100kilometers.
      * Caller owns returned value and must free it.
+     * Also see {@link #getLiterPer100Kilometers()}.
      * @param status ICU error code.
      * @stable ICU 56
      */
     static MeasureUnit *createLiterPer100Kilometers(UErrorCode &status);
 
     /**
-     * Returns unit of consumption: liter-per-kilometer.
+     * Returns by value, unit of consumption: liter-per-100kilometers.
+     * Also see {@link #createLiterPer100Kilometers()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getLiterPer100Kilometers();
+
+    /**
+     * Returns by pointer, unit of consumption: liter-per-kilometer.
      * Caller owns returned value and must free it.
+     * Also see {@link #getLiterPerKilometer()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createLiterPerKilometer(UErrorCode &status);
 
     /**
-     * Returns unit of consumption: mile-per-gallon.
+     * Returns by value, unit of consumption: liter-per-kilometer.
+     * Also see {@link #createLiterPerKilometer()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getLiterPerKilometer();
+
+    /**
+     * Returns by pointer, unit of consumption: mile-per-gallon.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMilePerGallon()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createMilePerGallon(UErrorCode &status);
 
     /**
-     * Returns unit of consumption: mile-per-gallon-imperial.
+     * Returns by value, unit of consumption: mile-per-gallon.
+     * Also see {@link #createMilePerGallon()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMilePerGallon();
+
+    /**
+     * Returns by pointer, unit of consumption: mile-per-gallon-imperial.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMilePerGallonImperial()}.
      * @param status ICU error code.
      * @stable ICU 57
      */
     static MeasureUnit *createMilePerGallonImperial(UErrorCode &status);
 
     /**
-     * Returns unit of digital: bit.
+     * Returns by value, unit of consumption: mile-per-gallon-imperial.
+     * Also see {@link #createMilePerGallonImperial()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMilePerGallonImperial();
+
+    /**
+     * Returns by pointer, unit of digital: bit.
      * Caller owns returned value and must free it.
+     * Also see {@link #getBit()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createBit(UErrorCode &status);
 
     /**
-     * Returns unit of digital: byte.
+     * Returns by value, unit of digital: bit.
+     * Also see {@link #createBit()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getBit();
+
+    /**
+     * Returns by pointer, unit of digital: byte.
      * Caller owns returned value and must free it.
+     * Also see {@link #getByte()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createByte(UErrorCode &status);
 
     /**
-     * Returns unit of digital: gigabit.
+     * Returns by value, unit of digital: byte.
+     * Also see {@link #createByte()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getByte();
+
+    /**
+     * Returns by pointer, unit of digital: gigabit.
      * Caller owns returned value and must free it.
+     * Also see {@link #getGigabit()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createGigabit(UErrorCode &status);
 
     /**
-     * Returns unit of digital: gigabyte.
+     * Returns by value, unit of digital: gigabit.
+     * Also see {@link #createGigabit()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getGigabit();
+
+    /**
+     * Returns by pointer, unit of digital: gigabyte.
      * Caller owns returned value and must free it.
+     * Also see {@link #getGigabyte()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createGigabyte(UErrorCode &status);
 
     /**
-     * Returns unit of digital: kilobit.
+     * Returns by value, unit of digital: gigabyte.
+     * Also see {@link #createGigabyte()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getGigabyte();
+
+    /**
+     * Returns by pointer, unit of digital: kilobit.
      * Caller owns returned value and must free it.
+     * Also see {@link #getKilobit()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createKilobit(UErrorCode &status);
 
     /**
-     * Returns unit of digital: kilobyte.
+     * Returns by value, unit of digital: kilobit.
+     * Also see {@link #createKilobit()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getKilobit();
+
+    /**
+     * Returns by pointer, unit of digital: kilobyte.
      * Caller owns returned value and must free it.
+     * Also see {@link #getKilobyte()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createKilobyte(UErrorCode &status);
 
     /**
-     * Returns unit of digital: megabit.
+     * Returns by value, unit of digital: kilobyte.
+     * Also see {@link #createKilobyte()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getKilobyte();
+
+    /**
+     * Returns by pointer, unit of digital: megabit.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMegabit()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createMegabit(UErrorCode &status);
 
     /**
-     * Returns unit of digital: megabyte.
+     * Returns by value, unit of digital: megabit.
+     * Also see {@link #createMegabit()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMegabit();
+
+    /**
+     * Returns by pointer, unit of digital: megabyte.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMegabyte()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createMegabyte(UErrorCode &status);
 
+    /**
+     * Returns by value, unit of digital: megabyte.
+     * Also see {@link #createMegabyte()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMegabyte();
+
 #ifndef U_HIDE_DRAFT_API
     /**
-     * Returns unit of digital: petabyte.
+     * Returns by pointer, unit of digital: petabyte.
      * Caller owns returned value and must free it.
+     * Also see {@link #getPetabyte()}.
      * @param status ICU error code.
      * @draft ICU 63
      */
     static MeasureUnit *createPetabyte(UErrorCode &status);
+
+    /**
+     * Returns by value, unit of digital: petabyte.
+     * Also see {@link #createPetabyte()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getPetabyte();
 #endif /* U_HIDE_DRAFT_API */
 
     /**
-     * Returns unit of digital: terabit.
+     * Returns by pointer, unit of digital: terabit.
      * Caller owns returned value and must free it.
+     * Also see {@link #getTerabit()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createTerabit(UErrorCode &status);
 
     /**
-     * Returns unit of digital: terabyte.
+     * Returns by value, unit of digital: terabit.
+     * Also see {@link #createTerabit()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getTerabit();
+
+    /**
+     * Returns by pointer, unit of digital: terabyte.
      * Caller owns returned value and must free it.
+     * Also see {@link #getTerabyte()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createTerabyte(UErrorCode &status);
 
     /**
-     * Returns unit of duration: century.
+     * Returns by value, unit of digital: terabyte.
+     * Also see {@link #createTerabyte()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getTerabyte();
+
+    /**
+     * Returns by pointer, unit of duration: century.
      * Caller owns returned value and must free it.
+     * Also see {@link #getCentury()}.
      * @param status ICU error code.
      * @stable ICU 56
      */
     static MeasureUnit *createCentury(UErrorCode &status);
 
     /**
-     * Returns unit of duration: day.
+     * Returns by value, unit of duration: century.
+     * Also see {@link #createCentury()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getCentury();
+
+    /**
+     * Returns by pointer, unit of duration: day.
      * Caller owns returned value and must free it.
+     * Also see {@link #getDay()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createDay(UErrorCode &status);
 
     /**
-     * Returns unit of duration: hour.
+     * Returns by value, unit of duration: day.
+     * Also see {@link #createDay()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getDay();
+
+    /**
+     * Returns by pointer, unit of duration: hour.
      * Caller owns returned value and must free it.
+     * Also see {@link #getHour()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createHour(UErrorCode &status);
 
     /**
-     * Returns unit of duration: microsecond.
+     * Returns by value, unit of duration: hour.
+     * Also see {@link #createHour()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getHour();
+
+    /**
+     * Returns by pointer, unit of duration: microsecond.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMicrosecond()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createMicrosecond(UErrorCode &status);
 
     /**
-     * Returns unit of duration: millisecond.
+     * Returns by value, unit of duration: microsecond.
+     * Also see {@link #createMicrosecond()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMicrosecond();
+
+    /**
+     * Returns by pointer, unit of duration: millisecond.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMillisecond()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createMillisecond(UErrorCode &status);
 
     /**
-     * Returns unit of duration: minute.
+     * Returns by value, unit of duration: millisecond.
+     * Also see {@link #createMillisecond()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMillisecond();
+
+    /**
+     * Returns by pointer, unit of duration: minute.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMinute()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createMinute(UErrorCode &status);
 
     /**
-     * Returns unit of duration: month.
+     * Returns by value, unit of duration: minute.
+     * Also see {@link #createMinute()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMinute();
+
+    /**
+     * Returns by pointer, unit of duration: month.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMonth()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createMonth(UErrorCode &status);
 
     /**
-     * Returns unit of duration: nanosecond.
+     * Returns by value, unit of duration: month.
+     * Also see {@link #createMonth()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMonth();
+
+    /**
+     * Returns by pointer, unit of duration: nanosecond.
      * Caller owns returned value and must free it.
+     * Also see {@link #getNanosecond()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createNanosecond(UErrorCode &status);
 
     /**
-     * Returns unit of duration: second.
+     * Returns by value, unit of duration: nanosecond.
+     * Also see {@link #createNanosecond()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getNanosecond();
+
+    /**
+     * Returns by pointer, unit of duration: second.
      * Caller owns returned value and must free it.
+     * Also see {@link #getSecond()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createSecond(UErrorCode &status);
 
     /**
-     * Returns unit of duration: week.
+     * Returns by value, unit of duration: second.
+     * Also see {@link #createSecond()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getSecond();
+
+    /**
+     * Returns by pointer, unit of duration: week.
      * Caller owns returned value and must free it.
+     * Also see {@link #getWeek()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createWeek(UErrorCode &status);
 
     /**
-     * Returns unit of duration: year.
+     * Returns by value, unit of duration: week.
+     * Also see {@link #createWeek()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getWeek();
+
+    /**
+     * Returns by pointer, unit of duration: year.
      * Caller owns returned value and must free it.
+     * Also see {@link #getYear()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createYear(UErrorCode &status);
 
     /**
-     * Returns unit of electric: ampere.
+     * Returns by value, unit of duration: year.
+     * Also see {@link #createYear()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getYear();
+
+    /**
+     * Returns by pointer, unit of electric: ampere.
      * Caller owns returned value and must free it.
+     * Also see {@link #getAmpere()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createAmpere(UErrorCode &status);
 
     /**
-     * Returns unit of electric: milliampere.
+     * Returns by value, unit of electric: ampere.
+     * Also see {@link #createAmpere()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getAmpere();
+
+    /**
+     * Returns by pointer, unit of electric: milliampere.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMilliampere()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createMilliampere(UErrorCode &status);
 
     /**
-     * Returns unit of electric: ohm.
+     * Returns by value, unit of electric: milliampere.
+     * Also see {@link #createMilliampere()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMilliampere();
+
+    /**
+     * Returns by pointer, unit of electric: ohm.
      * Caller owns returned value and must free it.
+     * Also see {@link #getOhm()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createOhm(UErrorCode &status);
 
     /**
-     * Returns unit of electric: volt.
+     * Returns by value, unit of electric: ohm.
+     * Also see {@link #createOhm()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getOhm();
+
+    /**
+     * Returns by pointer, unit of electric: volt.
      * Caller owns returned value and must free it.
+     * Also see {@link #getVolt()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createVolt(UErrorCode &status);
 
     /**
-     * Returns unit of energy: calorie.
+     * Returns by value, unit of electric: volt.
+     * Also see {@link #createVolt()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getVolt();
+
+    /**
+     * Returns by pointer, unit of energy: calorie.
      * Caller owns returned value and must free it.
+     * Also see {@link #getCalorie()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createCalorie(UErrorCode &status);
 
     /**
-     * Returns unit of energy: foodcalorie.
+     * Returns by value, unit of energy: calorie.
+     * Also see {@link #createCalorie()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getCalorie();
+
+    /**
+     * Returns by pointer, unit of energy: foodcalorie.
      * Caller owns returned value and must free it.
+     * Also see {@link #getFoodcalorie()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createFoodcalorie(UErrorCode &status);
 
     /**
-     * Returns unit of energy: joule.
+     * Returns by value, unit of energy: foodcalorie.
+     * Also see {@link #createFoodcalorie()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getFoodcalorie();
+
+    /**
+     * Returns by pointer, unit of energy: joule.
      * Caller owns returned value and must free it.
+     * Also see {@link #getJoule()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createJoule(UErrorCode &status);
 
     /**
-     * Returns unit of energy: kilocalorie.
+     * Returns by value, unit of energy: joule.
+     * Also see {@link #createJoule()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getJoule();
+
+    /**
+     * Returns by pointer, unit of energy: kilocalorie.
      * Caller owns returned value and must free it.
+     * Also see {@link #getKilocalorie()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createKilocalorie(UErrorCode &status);
 
     /**
-     * Returns unit of energy: kilojoule.
+     * Returns by value, unit of energy: kilocalorie.
+     * Also see {@link #createKilocalorie()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getKilocalorie();
+
+    /**
+     * Returns by pointer, unit of energy: kilojoule.
      * Caller owns returned value and must free it.
+     * Also see {@link #getKilojoule()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createKilojoule(UErrorCode &status);
 
     /**
-     * Returns unit of energy: kilowatt-hour.
+     * Returns by value, unit of energy: kilojoule.
+     * Also see {@link #createKilojoule()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getKilojoule();
+
+    /**
+     * Returns by pointer, unit of energy: kilowatt-hour.
      * Caller owns returned value and must free it.
+     * Also see {@link #getKilowattHour()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createKilowattHour(UErrorCode &status);
 
     /**
-     * Returns unit of frequency: gigahertz.
+     * Returns by value, unit of energy: kilowatt-hour.
+     * Also see {@link #createKilowattHour()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getKilowattHour();
+
+    /**
+     * Returns by pointer, unit of frequency: gigahertz.
      * Caller owns returned value and must free it.
+     * Also see {@link #getGigahertz()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createGigahertz(UErrorCode &status);
 
     /**
-     * Returns unit of frequency: hertz.
+     * Returns by value, unit of frequency: gigahertz.
+     * Also see {@link #createGigahertz()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getGigahertz();
+
+    /**
+     * Returns by pointer, unit of frequency: hertz.
      * Caller owns returned value and must free it.
+     * Also see {@link #getHertz()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createHertz(UErrorCode &status);
 
     /**
-     * Returns unit of frequency: kilohertz.
+     * Returns by value, unit of frequency: hertz.
+     * Also see {@link #createHertz()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getHertz();
+
+    /**
+     * Returns by pointer, unit of frequency: kilohertz.
      * Caller owns returned value and must free it.
+     * Also see {@link #getKilohertz()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createKilohertz(UErrorCode &status);
 
     /**
-     * Returns unit of frequency: megahertz.
+     * Returns by value, unit of frequency: kilohertz.
+     * Also see {@link #createKilohertz()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getKilohertz();
+
+    /**
+     * Returns by pointer, unit of frequency: megahertz.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMegahertz()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createMegahertz(UErrorCode &status);
 
     /**
-     * Returns unit of length: astronomical-unit.
+     * Returns by value, unit of frequency: megahertz.
+     * Also see {@link #createMegahertz()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMegahertz();
+
+    /**
+     * Returns by pointer, unit of length: astronomical-unit.
      * Caller owns returned value and must free it.
+     * Also see {@link #getAstronomicalUnit()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createAstronomicalUnit(UErrorCode &status);
 
     /**
-     * Returns unit of length: centimeter.
+     * Returns by value, unit of length: astronomical-unit.
+     * Also see {@link #createAstronomicalUnit()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getAstronomicalUnit();
+
+    /**
+     * Returns by pointer, unit of length: centimeter.
      * Caller owns returned value and must free it.
+     * Also see {@link #getCentimeter()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createCentimeter(UErrorCode &status);
 
     /**
-     * Returns unit of length: decimeter.
+     * Returns by value, unit of length: centimeter.
+     * Also see {@link #createCentimeter()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getCentimeter();
+
+    /**
+     * Returns by pointer, unit of length: decimeter.
      * Caller owns returned value and must free it.
+     * Also see {@link #getDecimeter()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createDecimeter(UErrorCode &status);
 
     /**
-     * Returns unit of length: fathom.
+     * Returns by value, unit of length: decimeter.
+     * Also see {@link #createDecimeter()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getDecimeter();
+
+    /**
+     * Returns by pointer, unit of length: fathom.
      * Caller owns returned value and must free it.
+     * Also see {@link #getFathom()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createFathom(UErrorCode &status);
 
     /**
-     * Returns unit of length: foot.
+     * Returns by value, unit of length: fathom.
+     * Also see {@link #createFathom()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getFathom();
+
+    /**
+     * Returns by pointer, unit of length: foot.
      * Caller owns returned value and must free it.
+     * Also see {@link #getFoot()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createFoot(UErrorCode &status);
 
     /**
-     * Returns unit of length: furlong.
+     * Returns by value, unit of length: foot.
+     * Also see {@link #createFoot()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getFoot();
+
+    /**
+     * Returns by pointer, unit of length: furlong.
      * Caller owns returned value and must free it.
+     * Also see {@link #getFurlong()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createFurlong(UErrorCode &status);
 
     /**
-     * Returns unit of length: inch.
+     * Returns by value, unit of length: furlong.
+     * Also see {@link #createFurlong()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getFurlong();
+
+    /**
+     * Returns by pointer, unit of length: inch.
      * Caller owns returned value and must free it.
+     * Also see {@link #getInch()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createInch(UErrorCode &status);
 
     /**
-     * Returns unit of length: kilometer.
+     * Returns by value, unit of length: inch.
+     * Also see {@link #createInch()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getInch();
+
+    /**
+     * Returns by pointer, unit of length: kilometer.
      * Caller owns returned value and must free it.
+     * Also see {@link #getKilometer()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createKilometer(UErrorCode &status);
 
     /**
-     * Returns unit of length: light-year.
+     * Returns by value, unit of length: kilometer.
+     * Also see {@link #createKilometer()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getKilometer();
+
+    /**
+     * Returns by pointer, unit of length: light-year.
      * Caller owns returned value and must free it.
+     * Also see {@link #getLightYear()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createLightYear(UErrorCode &status);
 
     /**
-     * Returns unit of length: meter.
+     * Returns by value, unit of length: light-year.
+     * Also see {@link #createLightYear()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getLightYear();
+
+    /**
+     * Returns by pointer, unit of length: meter.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMeter()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createMeter(UErrorCode &status);
 
     /**
-     * Returns unit of length: micrometer.
+     * Returns by value, unit of length: meter.
+     * Also see {@link #createMeter()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMeter();
+
+    /**
+     * Returns by pointer, unit of length: micrometer.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMicrometer()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createMicrometer(UErrorCode &status);
 
     /**
-     * Returns unit of length: mile.
+     * Returns by value, unit of length: micrometer.
+     * Also see {@link #createMicrometer()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMicrometer();
+
+    /**
+     * Returns by pointer, unit of length: mile.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMile()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createMile(UErrorCode &status);
 
     /**
-     * Returns unit of length: mile-scandinavian.
+     * Returns by value, unit of length: mile.
+     * Also see {@link #createMile()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMile();
+
+    /**
+     * Returns by pointer, unit of length: mile-scandinavian.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMileScandinavian()}.
      * @param status ICU error code.
      * @stable ICU 56
      */
     static MeasureUnit *createMileScandinavian(UErrorCode &status);
 
     /**
-     * Returns unit of length: millimeter.
+     * Returns by value, unit of length: mile-scandinavian.
+     * Also see {@link #createMileScandinavian()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMileScandinavian();
+
+    /**
+     * Returns by pointer, unit of length: millimeter.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMillimeter()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createMillimeter(UErrorCode &status);
 
     /**
-     * Returns unit of length: nanometer.
+     * Returns by value, unit of length: millimeter.
+     * Also see {@link #createMillimeter()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMillimeter();
+
+    /**
+     * Returns by pointer, unit of length: nanometer.
      * Caller owns returned value and must free it.
+     * Also see {@link #getNanometer()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createNanometer(UErrorCode &status);
 
     /**
-     * Returns unit of length: nautical-mile.
+     * Returns by value, unit of length: nanometer.
+     * Also see {@link #createNanometer()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getNanometer();
+
+    /**
+     * Returns by pointer, unit of length: nautical-mile.
      * Caller owns returned value and must free it.
+     * Also see {@link #getNauticalMile()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createNauticalMile(UErrorCode &status);
 
     /**
-     * Returns unit of length: parsec.
+     * Returns by value, unit of length: nautical-mile.
+     * Also see {@link #createNauticalMile()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getNauticalMile();
+
+    /**
+     * Returns by pointer, unit of length: parsec.
      * Caller owns returned value and must free it.
+     * Also see {@link #getParsec()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createParsec(UErrorCode &status);
 
     /**
-     * Returns unit of length: picometer.
+     * Returns by value, unit of length: parsec.
+     * Also see {@link #createParsec()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getParsec();
+
+    /**
+     * Returns by pointer, unit of length: picometer.
      * Caller owns returned value and must free it.
+     * Also see {@link #getPicometer()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createPicometer(UErrorCode &status);
 
     /**
-     * Returns unit of length: point.
+     * Returns by value, unit of length: picometer.
+     * Also see {@link #createPicometer()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getPicometer();
+
+    /**
+     * Returns by pointer, unit of length: point.
      * Caller owns returned value and must free it.
+     * Also see {@link #getPoint()}.
      * @param status ICU error code.
      * @stable ICU 59
      */
     static MeasureUnit *createPoint(UErrorCode &status);
 
     /**
-     * Returns unit of length: yard.
+     * Returns by value, unit of length: point.
+     * Also see {@link #createPoint()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getPoint();
+
+    /**
+     * Returns by pointer, unit of length: yard.
      * Caller owns returned value and must free it.
+     * Also see {@link #getYard()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createYard(UErrorCode &status);
 
     /**
-     * Returns unit of light: lux.
+     * Returns by value, unit of length: yard.
+     * Also see {@link #createYard()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getYard();
+
+    /**
+     * Returns by pointer, unit of light: lux.
      * Caller owns returned value and must free it.
+     * Also see {@link #getLux()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createLux(UErrorCode &status);
 
     /**
-     * Returns unit of mass: carat.
+     * Returns by value, unit of light: lux.
+     * Also see {@link #createLux()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getLux();
+
+    /**
+     * Returns by pointer, unit of mass: carat.
      * Caller owns returned value and must free it.
+     * Also see {@link #getCarat()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createCarat(UErrorCode &status);
 
     /**
-     * Returns unit of mass: gram.
+     * Returns by value, unit of mass: carat.
+     * Also see {@link #createCarat()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getCarat();
+
+    /**
+     * Returns by pointer, unit of mass: gram.
      * Caller owns returned value and must free it.
+     * Also see {@link #getGram()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createGram(UErrorCode &status);
 
     /**
-     * Returns unit of mass: kilogram.
+     * Returns by value, unit of mass: gram.
+     * Also see {@link #createGram()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getGram();
+
+    /**
+     * Returns by pointer, unit of mass: kilogram.
      * Caller owns returned value and must free it.
+     * Also see {@link #getKilogram()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createKilogram(UErrorCode &status);
 
     /**
-     * Returns unit of mass: metric-ton.
+     * Returns by value, unit of mass: kilogram.
+     * Also see {@link #createKilogram()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getKilogram();
+
+    /**
+     * Returns by pointer, unit of mass: metric-ton.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMetricTon()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createMetricTon(UErrorCode &status);
 
     /**
-     * Returns unit of mass: microgram.
+     * Returns by value, unit of mass: metric-ton.
+     * Also see {@link #createMetricTon()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMetricTon();
+
+    /**
+     * Returns by pointer, unit of mass: microgram.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMicrogram()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createMicrogram(UErrorCode &status);
 
     /**
-     * Returns unit of mass: milligram.
+     * Returns by value, unit of mass: microgram.
+     * Also see {@link #createMicrogram()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMicrogram();
+
+    /**
+     * Returns by pointer, unit of mass: milligram.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMilligram()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createMilligram(UErrorCode &status);
 
     /**
-     * Returns unit of mass: ounce.
+     * Returns by value, unit of mass: milligram.
+     * Also see {@link #createMilligram()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMilligram();
+
+    /**
+     * Returns by pointer, unit of mass: ounce.
      * Caller owns returned value and must free it.
+     * Also see {@link #getOunce()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createOunce(UErrorCode &status);
 
     /**
-     * Returns unit of mass: ounce-troy.
+     * Returns by value, unit of mass: ounce.
+     * Also see {@link #createOunce()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getOunce();
+
+    /**
+     * Returns by pointer, unit of mass: ounce-troy.
      * Caller owns returned value and must free it.
+     * Also see {@link #getOunceTroy()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createOunceTroy(UErrorCode &status);
 
     /**
-     * Returns unit of mass: pound.
+     * Returns by value, unit of mass: ounce-troy.
+     * Also see {@link #createOunceTroy()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getOunceTroy();
+
+    /**
+     * Returns by pointer, unit of mass: pound.
      * Caller owns returned value and must free it.
+     * Also see {@link #getPound()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createPound(UErrorCode &status);
 
     /**
-     * Returns unit of mass: stone.
+     * Returns by value, unit of mass: pound.
+     * Also see {@link #createPound()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getPound();
+
+    /**
+     * Returns by pointer, unit of mass: stone.
      * Caller owns returned value and must free it.
+     * Also see {@link #getStone()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createStone(UErrorCode &status);
 
     /**
-     * Returns unit of mass: ton.
+     * Returns by value, unit of mass: stone.
+     * Also see {@link #createStone()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getStone();
+
+    /**
+     * Returns by pointer, unit of mass: ton.
      * Caller owns returned value and must free it.
+     * Also see {@link #getTon()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createTon(UErrorCode &status);
 
     /**
-     * Returns unit of power: gigawatt.
+     * Returns by value, unit of mass: ton.
+     * Also see {@link #createTon()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getTon();
+
+    /**
+     * Returns by pointer, unit of power: gigawatt.
      * Caller owns returned value and must free it.
+     * Also see {@link #getGigawatt()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createGigawatt(UErrorCode &status);
 
     /**
-     * Returns unit of power: horsepower.
+     * Returns by value, unit of power: gigawatt.
+     * Also see {@link #createGigawatt()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getGigawatt();
+
+    /**
+     * Returns by pointer, unit of power: horsepower.
      * Caller owns returned value and must free it.
+     * Also see {@link #getHorsepower()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createHorsepower(UErrorCode &status);
 
     /**
-     * Returns unit of power: kilowatt.
+     * Returns by value, unit of power: horsepower.
+     * Also see {@link #createHorsepower()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getHorsepower();
+
+    /**
+     * Returns by pointer, unit of power: kilowatt.
      * Caller owns returned value and must free it.
+     * Also see {@link #getKilowatt()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createKilowatt(UErrorCode &status);
 
     /**
-     * Returns unit of power: megawatt.
+     * Returns by value, unit of power: kilowatt.
+     * Also see {@link #createKilowatt()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getKilowatt();
+
+    /**
+     * Returns by pointer, unit of power: megawatt.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMegawatt()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createMegawatt(UErrorCode &status);
 
     /**
-     * Returns unit of power: milliwatt.
+     * Returns by value, unit of power: megawatt.
+     * Also see {@link #createMegawatt()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMegawatt();
+
+    /**
+     * Returns by pointer, unit of power: milliwatt.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMilliwatt()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createMilliwatt(UErrorCode &status);
 
     /**
-     * Returns unit of power: watt.
+     * Returns by value, unit of power: milliwatt.
+     * Also see {@link #createMilliwatt()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMilliwatt();
+
+    /**
+     * Returns by pointer, unit of power: watt.
      * Caller owns returned value and must free it.
+     * Also see {@link #getWatt()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createWatt(UErrorCode &status);
 
+    /**
+     * Returns by value, unit of power: watt.
+     * Also see {@link #createWatt()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getWatt();
+
 #ifndef U_HIDE_DRAFT_API
     /**
-     * Returns unit of pressure: atmosphere.
+     * Returns by pointer, unit of pressure: atmosphere.
      * Caller owns returned value and must free it.
+     * Also see {@link #getAtmosphere()}.
      * @param status ICU error code.
      * @draft ICU 63
      */
     static MeasureUnit *createAtmosphere(UErrorCode &status);
+
+    /**
+     * Returns by value, unit of pressure: atmosphere.
+     * Also see {@link #createAtmosphere()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getAtmosphere();
 #endif /* U_HIDE_DRAFT_API */
 
     /**
-     * Returns unit of pressure: hectopascal.
+     * Returns by pointer, unit of pressure: hectopascal.
      * Caller owns returned value and must free it.
+     * Also see {@link #getHectopascal()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createHectopascal(UErrorCode &status);
 
     /**
-     * Returns unit of pressure: inch-hg.
+     * Returns by value, unit of pressure: hectopascal.
+     * Also see {@link #createHectopascal()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getHectopascal();
+
+    /**
+     * Returns by pointer, unit of pressure: inch-hg.
      * Caller owns returned value and must free it.
+     * Also see {@link #getInchHg()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createInchHg(UErrorCode &status);
 
     /**
-     * Returns unit of pressure: millibar.
+     * Returns by value, unit of pressure: inch-hg.
+     * Also see {@link #createInchHg()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getInchHg();
+
+    /**
+     * Returns by pointer, unit of pressure: millibar.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMillibar()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createMillibar(UErrorCode &status);
 
     /**
-     * Returns unit of pressure: millimeter-of-mercury.
+     * Returns by value, unit of pressure: millibar.
+     * Also see {@link #createMillibar()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMillibar();
+
+    /**
+     * Returns by pointer, unit of pressure: millimeter-of-mercury.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMillimeterOfMercury()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createMillimeterOfMercury(UErrorCode &status);
 
     /**
-     * Returns unit of pressure: pound-per-square-inch.
+     * Returns by value, unit of pressure: millimeter-of-mercury.
+     * Also see {@link #createMillimeterOfMercury()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMillimeterOfMercury();
+
+    /**
+     * Returns by pointer, unit of pressure: pound-per-square-inch.
      * Caller owns returned value and must free it.
+     * Also see {@link #getPoundPerSquareInch()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createPoundPerSquareInch(UErrorCode &status);
 
     /**
-     * Returns unit of speed: kilometer-per-hour.
+     * Returns by value, unit of pressure: pound-per-square-inch.
+     * Also see {@link #createPoundPerSquareInch()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getPoundPerSquareInch();
+
+    /**
+     * Returns by pointer, unit of speed: kilometer-per-hour.
      * Caller owns returned value and must free it.
+     * Also see {@link #getKilometerPerHour()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createKilometerPerHour(UErrorCode &status);
 
     /**
-     * Returns unit of speed: knot.
+     * Returns by value, unit of speed: kilometer-per-hour.
+     * Also see {@link #createKilometerPerHour()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getKilometerPerHour();
+
+    /**
+     * Returns by pointer, unit of speed: knot.
      * Caller owns returned value and must free it.
+     * Also see {@link #getKnot()}.
      * @param status ICU error code.
      * @stable ICU 56
      */
     static MeasureUnit *createKnot(UErrorCode &status);
 
     /**
-     * Returns unit of speed: meter-per-second.
+     * Returns by value, unit of speed: knot.
+     * Also see {@link #createKnot()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getKnot();
+
+    /**
+     * Returns by pointer, unit of speed: meter-per-second.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMeterPerSecond()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createMeterPerSecond(UErrorCode &status);
 
     /**
-     * Returns unit of speed: mile-per-hour.
+     * Returns by value, unit of speed: meter-per-second.
+     * Also see {@link #createMeterPerSecond()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMeterPerSecond();
+
+    /**
+     * Returns by pointer, unit of speed: mile-per-hour.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMilePerHour()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createMilePerHour(UErrorCode &status);
 
     /**
-     * Returns unit of temperature: celsius.
+     * Returns by value, unit of speed: mile-per-hour.
+     * Also see {@link #createMilePerHour()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMilePerHour();
+
+    /**
+     * Returns by pointer, unit of temperature: celsius.
      * Caller owns returned value and must free it.
+     * Also see {@link #getCelsius()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createCelsius(UErrorCode &status);
 
     /**
-     * Returns unit of temperature: fahrenheit.
+     * Returns by value, unit of temperature: celsius.
+     * Also see {@link #createCelsius()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getCelsius();
+
+    /**
+     * Returns by pointer, unit of temperature: fahrenheit.
      * Caller owns returned value and must free it.
+     * Also see {@link #getFahrenheit()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createFahrenheit(UErrorCode &status);
 
     /**
-     * Returns unit of temperature: generic.
+     * Returns by value, unit of temperature: fahrenheit.
+     * Also see {@link #createFahrenheit()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getFahrenheit();
+
+    /**
+     * Returns by pointer, unit of temperature: generic.
      * Caller owns returned value and must free it.
+     * Also see {@link #getGenericTemperature()}.
      * @param status ICU error code.
      * @stable ICU 56
      */
     static MeasureUnit *createGenericTemperature(UErrorCode &status);
 
     /**
-     * Returns unit of temperature: kelvin.
+     * Returns by value, unit of temperature: generic.
+     * Also see {@link #createGenericTemperature()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getGenericTemperature();
+
+    /**
+     * Returns by pointer, unit of temperature: kelvin.
      * Caller owns returned value and must free it.
+     * Also see {@link #getKelvin()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createKelvin(UErrorCode &status);
 
     /**
-     * Returns unit of volume: acre-foot.
+     * Returns by value, unit of temperature: kelvin.
+     * Also see {@link #createKelvin()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getKelvin();
+
+    /**
+     * Returns by pointer, unit of volume: acre-foot.
      * Caller owns returned value and must free it.
+     * Also see {@link #getAcreFoot()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createAcreFoot(UErrorCode &status);
 
     /**
-     * Returns unit of volume: bushel.
+     * Returns by value, unit of volume: acre-foot.
+     * Also see {@link #createAcreFoot()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getAcreFoot();
+
+    /**
+     * Returns by pointer, unit of volume: bushel.
      * Caller owns returned value and must free it.
+     * Also see {@link #getBushel()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createBushel(UErrorCode &status);
 
     /**
-     * Returns unit of volume: centiliter.
+     * Returns by value, unit of volume: bushel.
+     * Also see {@link #createBushel()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getBushel();
+
+    /**
+     * Returns by pointer, unit of volume: centiliter.
      * Caller owns returned value and must free it.
+     * Also see {@link #getCentiliter()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createCentiliter(UErrorCode &status);
 
     /**
-     * Returns unit of volume: cubic-centimeter.
+     * Returns by value, unit of volume: centiliter.
+     * Also see {@link #createCentiliter()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getCentiliter();
+
+    /**
+     * Returns by pointer, unit of volume: cubic-centimeter.
      * Caller owns returned value and must free it.
+     * Also see {@link #getCubicCentimeter()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createCubicCentimeter(UErrorCode &status);
 
     /**
-     * Returns unit of volume: cubic-foot.
+     * Returns by value, unit of volume: cubic-centimeter.
+     * Also see {@link #createCubicCentimeter()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getCubicCentimeter();
+
+    /**
+     * Returns by pointer, unit of volume: cubic-foot.
      * Caller owns returned value and must free it.
+     * Also see {@link #getCubicFoot()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createCubicFoot(UErrorCode &status);
 
     /**
-     * Returns unit of volume: cubic-inch.
+     * Returns by value, unit of volume: cubic-foot.
+     * Also see {@link #createCubicFoot()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getCubicFoot();
+
+    /**
+     * Returns by pointer, unit of volume: cubic-inch.
      * Caller owns returned value and must free it.
+     * Also see {@link #getCubicInch()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createCubicInch(UErrorCode &status);
 
     /**
-     * Returns unit of volume: cubic-kilometer.
+     * Returns by value, unit of volume: cubic-inch.
+     * Also see {@link #createCubicInch()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getCubicInch();
+
+    /**
+     * Returns by pointer, unit of volume: cubic-kilometer.
      * Caller owns returned value and must free it.
+     * Also see {@link #getCubicKilometer()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createCubicKilometer(UErrorCode &status);
 
     /**
-     * Returns unit of volume: cubic-meter.
+     * Returns by value, unit of volume: cubic-kilometer.
+     * Also see {@link #createCubicKilometer()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getCubicKilometer();
+
+    /**
+     * Returns by pointer, unit of volume: cubic-meter.
      * Caller owns returned value and must free it.
+     * Also see {@link #getCubicMeter()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createCubicMeter(UErrorCode &status);
 
     /**
-     * Returns unit of volume: cubic-mile.
+     * Returns by value, unit of volume: cubic-meter.
+     * Also see {@link #createCubicMeter()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getCubicMeter();
+
+    /**
+     * Returns by pointer, unit of volume: cubic-mile.
      * Caller owns returned value and must free it.
+     * Also see {@link #getCubicMile()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createCubicMile(UErrorCode &status);
 
     /**
-     * Returns unit of volume: cubic-yard.
+     * Returns by value, unit of volume: cubic-mile.
+     * Also see {@link #createCubicMile()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getCubicMile();
+
+    /**
+     * Returns by pointer, unit of volume: cubic-yard.
      * Caller owns returned value and must free it.
+     * Also see {@link #getCubicYard()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createCubicYard(UErrorCode &status);
 
     /**
-     * Returns unit of volume: cup.
+     * Returns by value, unit of volume: cubic-yard.
+     * Also see {@link #createCubicYard()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getCubicYard();
+
+    /**
+     * Returns by pointer, unit of volume: cup.
      * Caller owns returned value and must free it.
+     * Also see {@link #getCup()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createCup(UErrorCode &status);
 
     /**
-     * Returns unit of volume: cup-metric.
+     * Returns by value, unit of volume: cup.
+     * Also see {@link #createCup()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getCup();
+
+    /**
+     * Returns by pointer, unit of volume: cup-metric.
      * Caller owns returned value and must free it.
+     * Also see {@link #getCupMetric()}.
      * @param status ICU error code.
      * @stable ICU 56
      */
     static MeasureUnit *createCupMetric(UErrorCode &status);
 
     /**
-     * Returns unit of volume: deciliter.
+     * Returns by value, unit of volume: cup-metric.
+     * Also see {@link #createCupMetric()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getCupMetric();
+
+    /**
+     * Returns by pointer, unit of volume: deciliter.
      * Caller owns returned value and must free it.
+     * Also see {@link #getDeciliter()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createDeciliter(UErrorCode &status);
 
     /**
-     * Returns unit of volume: fluid-ounce.
+     * Returns by value, unit of volume: deciliter.
+     * Also see {@link #createDeciliter()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getDeciliter();
+
+    /**
+     * Returns by pointer, unit of volume: fluid-ounce.
      * Caller owns returned value and must free it.
+     * Also see {@link #getFluidOunce()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createFluidOunce(UErrorCode &status);
 
     /**
-     * Returns unit of volume: gallon.
+     * Returns by value, unit of volume: fluid-ounce.
+     * Also see {@link #createFluidOunce()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getFluidOunce();
+
+    /**
+     * Returns by pointer, unit of volume: gallon.
      * Caller owns returned value and must free it.
+     * Also see {@link #getGallon()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createGallon(UErrorCode &status);
 
     /**
-     * Returns unit of volume: gallon-imperial.
+     * Returns by value, unit of volume: gallon.
+     * Also see {@link #createGallon()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getGallon();
+
+    /**
+     * Returns by pointer, unit of volume: gallon-imperial.
      * Caller owns returned value and must free it.
+     * Also see {@link #getGallonImperial()}.
      * @param status ICU error code.
      * @stable ICU 57
      */
     static MeasureUnit *createGallonImperial(UErrorCode &status);
 
     /**
-     * Returns unit of volume: hectoliter.
+     * Returns by value, unit of volume: gallon-imperial.
+     * Also see {@link #createGallonImperial()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getGallonImperial();
+
+    /**
+     * Returns by pointer, unit of volume: hectoliter.
      * Caller owns returned value and must free it.
+     * Also see {@link #getHectoliter()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createHectoliter(UErrorCode &status);
 
     /**
-     * Returns unit of volume: liter.
+     * Returns by value, unit of volume: hectoliter.
+     * Also see {@link #createHectoliter()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getHectoliter();
+
+    /**
+     * Returns by pointer, unit of volume: liter.
      * Caller owns returned value and must free it.
+     * Also see {@link #getLiter()}.
      * @param status ICU error code.
      * @stable ICU 53
      */
     static MeasureUnit *createLiter(UErrorCode &status);
 
     /**
-     * Returns unit of volume: megaliter.
+     * Returns by value, unit of volume: liter.
+     * Also see {@link #createLiter()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getLiter();
+
+    /**
+     * Returns by pointer, unit of volume: megaliter.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMegaliter()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createMegaliter(UErrorCode &status);
 
     /**
-     * Returns unit of volume: milliliter.
+     * Returns by value, unit of volume: megaliter.
+     * Also see {@link #createMegaliter()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMegaliter();
+
+    /**
+     * Returns by pointer, unit of volume: milliliter.
      * Caller owns returned value and must free it.
+     * Also see {@link #getMilliliter()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createMilliliter(UErrorCode &status);
 
     /**
-     * Returns unit of volume: pint.
+     * Returns by value, unit of volume: milliliter.
+     * Also see {@link #createMilliliter()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getMilliliter();
+
+    /**
+     * Returns by pointer, unit of volume: pint.
      * Caller owns returned value and must free it.
+     * Also see {@link #getPint()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createPint(UErrorCode &status);
 
     /**
-     * Returns unit of volume: pint-metric.
+     * Returns by value, unit of volume: pint.
+     * Also see {@link #createPint()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getPint();
+
+    /**
+     * Returns by pointer, unit of volume: pint-metric.
      * Caller owns returned value and must free it.
+     * Also see {@link #getPintMetric()}.
      * @param status ICU error code.
      * @stable ICU 56
      */
     static MeasureUnit *createPintMetric(UErrorCode &status);
 
     /**
-     * Returns unit of volume: quart.
+     * Returns by value, unit of volume: pint-metric.
+     * Also see {@link #createPintMetric()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getPintMetric();
+
+    /**
+     * Returns by pointer, unit of volume: quart.
      * Caller owns returned value and must free it.
+     * Also see {@link #getQuart()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createQuart(UErrorCode &status);
 
     /**
-     * Returns unit of volume: tablespoon.
+     * Returns by value, unit of volume: quart.
+     * Also see {@link #createQuart()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getQuart();
+
+    /**
+     * Returns by pointer, unit of volume: tablespoon.
      * Caller owns returned value and must free it.
+     * Also see {@link #getTablespoon()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createTablespoon(UErrorCode &status);
 
     /**
-     * Returns unit of volume: teaspoon.
+     * Returns by value, unit of volume: tablespoon.
+     * Also see {@link #createTablespoon()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getTablespoon();
+
+    /**
+     * Returns by pointer, unit of volume: teaspoon.
      * Caller owns returned value and must free it.
+     * Also see {@link #getTeaspoon()}.
      * @param status ICU error code.
      * @stable ICU 54
      */
     static MeasureUnit *createTeaspoon(UErrorCode &status);
 
+    /**
+     * Returns by value, unit of volume: teaspoon.
+     * Also see {@link #createTeaspoon()}.
+     * @draft ICU 64
+     */
+    static MeasureUnit getTeaspoon();
+
 
 // End generated createXXX methods
 
diff --git a/icu4c/source/i18n/unicode/numberformatter.h b/icu4c/source/i18n/unicode/numberformatter.h
index eb3e9f8..3ce74e2 100644
--- a/icu4c/source/i18n/unicode/numberformatter.h
+++ b/icu4c/source/i18n/unicode/numberformatter.h
@@ -53,7 +53,7 @@
  * // Create a "template" in a singleton unique_ptr but without setting a locale until the call site:
  * std::unique_ptr<UnlocalizedNumberFormatter> template = NumberFormatter::with()
  *     .sign(UNumberSignDisplay::UNUM_SIGN_ALWAYS)
- *     .adoptUnit(MeasureUnit::createMeter(status))
+ *     .unit(MeasureUnit::getMeter())
  *     .unitWidth(UNumberUnitWidth::UNUM_UNIT_WIDTH_FULL_NAME)
  *     .clone();
  * template->locale(...).format(1234).toString();  // +1,234 meters in en-US
@@ -1489,11 +1489,10 @@
      * All units will be properly localized with locale data, and all units are compatible with notation styles,
      * rounding precisions, and other number formatter settings.
      *
-     * Pass this method any instance of {@link MeasureUnit}. For units of measure (which often involve the
-     * factory methods that return a pointer):
+     * Pass this method any instance of {@link MeasureUnit}. For units of measure:
      *
      * <pre>
-     * NumberFormatter::with().adoptUnit(MeasureUnit::createMeter(status))
+     * NumberFormatter::with().unit(MeasureUnit::getMeter())
      * </pre>
      *
      * Currency:
@@ -1536,11 +1535,9 @@
 
     /**
      * Like unit(), but takes ownership of a pointer.  Convenient for use with the MeasureFormat factory
-     * methods, which return pointers that need ownership.  Example:
+     * methods that return pointers that need ownership.
      *
-     * <pre>
-     * NumberFormatter::with().adoptUnit(MeasureUnit::createMeter(status))
-     * </pre>
+     * Note: consider using the MeasureFormat factory methods that return by value.
      *
      * @param unit
      *            The unit to render.
@@ -1566,8 +1563,13 @@
      * Sets a unit to be used in the denominator. For example, to format "3 m/s", pass METER to the unit and SECOND to
      * the perUnit.
      *
-     * Pass this method any instance of {@link MeasureUnit}.  Since MeasureUnit factory methods return pointers, the
-     * {@link #adoptPerUnit} version of this method is often more useful.
+     * Pass this method any instance of {@link MeasureUnit}. Example:
+     *
+     * <pre>
+     * NumberFormatter::with()
+     *      .unit(MeasureUnit::getMeter())
+     *      .perUnit(MeasureUnit::getSecond())
+     * </pre>
      *
      * The default is not to display any unit in the denominator.
      *
@@ -1594,13 +1596,9 @@
 
     /**
      * Like perUnit(), but takes ownership of a pointer.  Convenient for use with the MeasureFormat factory
-     * methods, which return pointers that need ownership.  Example:
+     * methods that return pointers that need ownership.
      *
-     * <pre>
-     * NumberFormatter::with()
-     *      .adoptUnit(MeasureUnit::createMeter(status))
-     *      .adoptPerUnit(MeasureUnit::createSecond(status))
-     * </pre>
+     * Note: consider using the MeasureFormat factory methods that return by value.
      *
      * @param perUnit
      *            The unit to render in the denominator.
diff --git a/icu4c/source/test/intltest/measfmttest.cpp b/icu4c/source/test/intltest/measfmttest.cpp
index a0599ba..4fb9ee8 100644
--- a/icu4c/source/test/intltest/measfmttest.cpp
+++ b/icu4c/source/test/intltest/measfmttest.cpp
@@ -51,6 +51,7 @@
     void TestCompatible58();
     void TestCompatible59();
     void TestCompatible63();
+    void TestCompatible64();
     void TestGetAvailable();
     void TestExamplesInDocs();
     void TestFormatPeriodEn();
@@ -149,6 +150,7 @@
     TESTCASE_AUTO(TestCompatible58);
     TESTCASE_AUTO(TestCompatible59);
     TESTCASE_AUTO(TestCompatible63);
+    TESTCASE_AUTO(TestCompatible64);
     TESTCASE_AUTO(TestGetAvailable);
     TESTCASE_AUTO(TestExamplesInDocs);
     TESTCASE_AUTO(TestFormatPeriodEn);
@@ -1189,6 +1191,291 @@
     assertSuccess("", status);
 }
 
+void MeasureFormatTest::TestCompatible64() {
+    UErrorCode status = U_ZERO_ERROR;
+    LocalPointer<MeasureUnit> measureUnit;
+    MeasureUnit measureUnitValue;
+    measureUnit.adoptInstead(MeasureUnit::createGForce(status));
+    measureUnitValue = MeasureUnit::getGForce();
+    measureUnit.adoptInstead(MeasureUnit::createMeterPerSecondSquared(status));
+    measureUnitValue = MeasureUnit::getMeterPerSecondSquared();
+    measureUnit.adoptInstead(MeasureUnit::createArcMinute(status));
+    measureUnitValue = MeasureUnit::getArcMinute();
+    measureUnit.adoptInstead(MeasureUnit::createArcSecond(status));
+    measureUnitValue = MeasureUnit::getArcSecond();
+    measureUnit.adoptInstead(MeasureUnit::createDegree(status));
+    measureUnitValue = MeasureUnit::getDegree();
+    measureUnit.adoptInstead(MeasureUnit::createRadian(status));
+    measureUnitValue = MeasureUnit::getRadian();
+    measureUnit.adoptInstead(MeasureUnit::createRevolutionAngle(status));
+    measureUnitValue = MeasureUnit::getRevolutionAngle();
+    measureUnit.adoptInstead(MeasureUnit::createAcre(status));
+    measureUnitValue = MeasureUnit::getAcre();
+    measureUnit.adoptInstead(MeasureUnit::createHectare(status));
+    measureUnitValue = MeasureUnit::getHectare();
+    measureUnit.adoptInstead(MeasureUnit::createSquareCentimeter(status));
+    measureUnitValue = MeasureUnit::getSquareCentimeter();
+    measureUnit.adoptInstead(MeasureUnit::createSquareFoot(status));
+    measureUnitValue = MeasureUnit::getSquareFoot();
+    measureUnit.adoptInstead(MeasureUnit::createSquareInch(status));
+    measureUnitValue = MeasureUnit::getSquareInch();
+    measureUnit.adoptInstead(MeasureUnit::createSquareKilometer(status));
+    measureUnitValue = MeasureUnit::getSquareKilometer();
+    measureUnit.adoptInstead(MeasureUnit::createSquareMeter(status));
+    measureUnitValue = MeasureUnit::getSquareMeter();
+    measureUnit.adoptInstead(MeasureUnit::createSquareMile(status));
+    measureUnitValue = MeasureUnit::getSquareMile();
+    measureUnit.adoptInstead(MeasureUnit::createSquareYard(status));
+    measureUnitValue = MeasureUnit::getSquareYard();
+    measureUnit.adoptInstead(MeasureUnit::createKarat(status));
+    measureUnitValue = MeasureUnit::getKarat();
+    measureUnit.adoptInstead(MeasureUnit::createMilligramPerDeciliter(status));
+    measureUnitValue = MeasureUnit::getMilligramPerDeciliter();
+    measureUnit.adoptInstead(MeasureUnit::createMillimolePerLiter(status));
+    measureUnitValue = MeasureUnit::getMillimolePerLiter();
+    measureUnit.adoptInstead(MeasureUnit::createPartPerMillion(status));
+    measureUnitValue = MeasureUnit::getPartPerMillion();
+    measureUnit.adoptInstead(MeasureUnit::createPercent(status));
+    measureUnitValue = MeasureUnit::getPercent();
+    measureUnit.adoptInstead(MeasureUnit::createPermille(status));
+    measureUnitValue = MeasureUnit::getPermille();
+    measureUnit.adoptInstead(MeasureUnit::createLiterPer100Kilometers(status));
+    measureUnitValue = MeasureUnit::getLiterPer100Kilometers();
+    measureUnit.adoptInstead(MeasureUnit::createLiterPerKilometer(status));
+    measureUnitValue = MeasureUnit::getLiterPerKilometer();
+    measureUnit.adoptInstead(MeasureUnit::createMilePerGallon(status));
+    measureUnitValue = MeasureUnit::getMilePerGallon();
+    measureUnit.adoptInstead(MeasureUnit::createMilePerGallonImperial(status));
+    measureUnitValue = MeasureUnit::getMilePerGallonImperial();
+    measureUnit.adoptInstead(MeasureUnit::createBit(status));
+    measureUnitValue = MeasureUnit::getBit();
+    measureUnit.adoptInstead(MeasureUnit::createByte(status));
+    measureUnitValue = MeasureUnit::getByte();
+    measureUnit.adoptInstead(MeasureUnit::createGigabit(status));
+    measureUnitValue = MeasureUnit::getGigabit();
+    measureUnit.adoptInstead(MeasureUnit::createGigabyte(status));
+    measureUnitValue = MeasureUnit::getGigabyte();
+    measureUnit.adoptInstead(MeasureUnit::createKilobit(status));
+    measureUnitValue = MeasureUnit::getKilobit();
+    measureUnit.adoptInstead(MeasureUnit::createKilobyte(status));
+    measureUnitValue = MeasureUnit::getKilobyte();
+    measureUnit.adoptInstead(MeasureUnit::createMegabit(status));
+    measureUnitValue = MeasureUnit::getMegabit();
+    measureUnit.adoptInstead(MeasureUnit::createMegabyte(status));
+    measureUnitValue = MeasureUnit::getMegabyte();
+    measureUnit.adoptInstead(MeasureUnit::createPetabyte(status));
+    measureUnitValue = MeasureUnit::getPetabyte();
+    measureUnit.adoptInstead(MeasureUnit::createTerabit(status));
+    measureUnitValue = MeasureUnit::getTerabit();
+    measureUnit.adoptInstead(MeasureUnit::createTerabyte(status));
+    measureUnitValue = MeasureUnit::getTerabyte();
+    measureUnit.adoptInstead(MeasureUnit::createCentury(status));
+    measureUnitValue = MeasureUnit::getCentury();
+    measureUnit.adoptInstead(MeasureUnit::createDay(status));
+    measureUnitValue = MeasureUnit::getDay();
+    measureUnit.adoptInstead(MeasureUnit::createHour(status));
+    measureUnitValue = MeasureUnit::getHour();
+    measureUnit.adoptInstead(MeasureUnit::createMicrosecond(status));
+    measureUnitValue = MeasureUnit::getMicrosecond();
+    measureUnit.adoptInstead(MeasureUnit::createMillisecond(status));
+    measureUnitValue = MeasureUnit::getMillisecond();
+    measureUnit.adoptInstead(MeasureUnit::createMinute(status));
+    measureUnitValue = MeasureUnit::getMinute();
+    measureUnit.adoptInstead(MeasureUnit::createMonth(status));
+    measureUnitValue = MeasureUnit::getMonth();
+    measureUnit.adoptInstead(MeasureUnit::createNanosecond(status));
+    measureUnitValue = MeasureUnit::getNanosecond();
+    measureUnit.adoptInstead(MeasureUnit::createSecond(status));
+    measureUnitValue = MeasureUnit::getSecond();
+    measureUnit.adoptInstead(MeasureUnit::createWeek(status));
+    measureUnitValue = MeasureUnit::getWeek();
+    measureUnit.adoptInstead(MeasureUnit::createYear(status));
+    measureUnitValue = MeasureUnit::getYear();
+    measureUnit.adoptInstead(MeasureUnit::createAmpere(status));
+    measureUnitValue = MeasureUnit::getAmpere();
+    measureUnit.adoptInstead(MeasureUnit::createMilliampere(status));
+    measureUnitValue = MeasureUnit::getMilliampere();
+    measureUnit.adoptInstead(MeasureUnit::createOhm(status));
+    measureUnitValue = MeasureUnit::getOhm();
+    measureUnit.adoptInstead(MeasureUnit::createVolt(status));
+    measureUnitValue = MeasureUnit::getVolt();
+    measureUnit.adoptInstead(MeasureUnit::createCalorie(status));
+    measureUnitValue = MeasureUnit::getCalorie();
+    measureUnit.adoptInstead(MeasureUnit::createFoodcalorie(status));
+    measureUnitValue = MeasureUnit::getFoodcalorie();
+    measureUnit.adoptInstead(MeasureUnit::createJoule(status));
+    measureUnitValue = MeasureUnit::getJoule();
+    measureUnit.adoptInstead(MeasureUnit::createKilocalorie(status));
+    measureUnitValue = MeasureUnit::getKilocalorie();
+    measureUnit.adoptInstead(MeasureUnit::createKilojoule(status));
+    measureUnitValue = MeasureUnit::getKilojoule();
+    measureUnit.adoptInstead(MeasureUnit::createKilowattHour(status));
+    measureUnitValue = MeasureUnit::getKilowattHour();
+    measureUnit.adoptInstead(MeasureUnit::createGigahertz(status));
+    measureUnitValue = MeasureUnit::getGigahertz();
+    measureUnit.adoptInstead(MeasureUnit::createHertz(status));
+    measureUnitValue = MeasureUnit::getHertz();
+    measureUnit.adoptInstead(MeasureUnit::createKilohertz(status));
+    measureUnitValue = MeasureUnit::getKilohertz();
+    measureUnit.adoptInstead(MeasureUnit::createMegahertz(status));
+    measureUnitValue = MeasureUnit::getMegahertz();
+    measureUnit.adoptInstead(MeasureUnit::createAstronomicalUnit(status));
+    measureUnitValue = MeasureUnit::getAstronomicalUnit();
+    measureUnit.adoptInstead(MeasureUnit::createCentimeter(status));
+    measureUnitValue = MeasureUnit::getCentimeter();
+    measureUnit.adoptInstead(MeasureUnit::createDecimeter(status));
+    measureUnitValue = MeasureUnit::getDecimeter();
+    measureUnit.adoptInstead(MeasureUnit::createFathom(status));
+    measureUnitValue = MeasureUnit::getFathom();
+    measureUnit.adoptInstead(MeasureUnit::createFoot(status));
+    measureUnitValue = MeasureUnit::getFoot();
+    measureUnit.adoptInstead(MeasureUnit::createFurlong(status));
+    measureUnitValue = MeasureUnit::getFurlong();
+    measureUnit.adoptInstead(MeasureUnit::createInch(status));
+    measureUnitValue = MeasureUnit::getInch();
+    measureUnit.adoptInstead(MeasureUnit::createKilometer(status));
+    measureUnitValue = MeasureUnit::getKilometer();
+    measureUnit.adoptInstead(MeasureUnit::createLightYear(status));
+    measureUnitValue = MeasureUnit::getLightYear();
+    measureUnit.adoptInstead(MeasureUnit::createMeter(status));
+    measureUnitValue = MeasureUnit::getMeter();
+    measureUnit.adoptInstead(MeasureUnit::createMicrometer(status));
+    measureUnitValue = MeasureUnit::getMicrometer();
+    measureUnit.adoptInstead(MeasureUnit::createMile(status));
+    measureUnitValue = MeasureUnit::getMile();
+    measureUnit.adoptInstead(MeasureUnit::createMileScandinavian(status));
+    measureUnitValue = MeasureUnit::getMileScandinavian();
+    measureUnit.adoptInstead(MeasureUnit::createMillimeter(status));
+    measureUnitValue = MeasureUnit::getMillimeter();
+    measureUnit.adoptInstead(MeasureUnit::createNanometer(status));
+    measureUnitValue = MeasureUnit::getNanometer();
+    measureUnit.adoptInstead(MeasureUnit::createNauticalMile(status));
+    measureUnitValue = MeasureUnit::getNauticalMile();
+    measureUnit.adoptInstead(MeasureUnit::createParsec(status));
+    measureUnitValue = MeasureUnit::getParsec();
+    measureUnit.adoptInstead(MeasureUnit::createPicometer(status));
+    measureUnitValue = MeasureUnit::getPicometer();
+    measureUnit.adoptInstead(MeasureUnit::createPoint(status));
+    measureUnitValue = MeasureUnit::getPoint();
+    measureUnit.adoptInstead(MeasureUnit::createYard(status));
+    measureUnitValue = MeasureUnit::getYard();
+    measureUnit.adoptInstead(MeasureUnit::createLux(status));
+    measureUnitValue = MeasureUnit::getLux();
+    measureUnit.adoptInstead(MeasureUnit::createCarat(status));
+    measureUnitValue = MeasureUnit::getCarat();
+    measureUnit.adoptInstead(MeasureUnit::createGram(status));
+    measureUnitValue = MeasureUnit::getGram();
+    measureUnit.adoptInstead(MeasureUnit::createKilogram(status));
+    measureUnitValue = MeasureUnit::getKilogram();
+    measureUnit.adoptInstead(MeasureUnit::createMetricTon(status));
+    measureUnitValue = MeasureUnit::getMetricTon();
+    measureUnit.adoptInstead(MeasureUnit::createMicrogram(status));
+    measureUnitValue = MeasureUnit::getMicrogram();
+    measureUnit.adoptInstead(MeasureUnit::createMilligram(status));
+    measureUnitValue = MeasureUnit::getMilligram();
+    measureUnit.adoptInstead(MeasureUnit::createOunce(status));
+    measureUnitValue = MeasureUnit::getOunce();
+    measureUnit.adoptInstead(MeasureUnit::createOunceTroy(status));
+    measureUnitValue = MeasureUnit::getOunceTroy();
+    measureUnit.adoptInstead(MeasureUnit::createPound(status));
+    measureUnitValue = MeasureUnit::getPound();
+    measureUnit.adoptInstead(MeasureUnit::createStone(status));
+    measureUnitValue = MeasureUnit::getStone();
+    measureUnit.adoptInstead(MeasureUnit::createTon(status));
+    measureUnitValue = MeasureUnit::getTon();
+    measureUnit.adoptInstead(MeasureUnit::createGigawatt(status));
+    measureUnitValue = MeasureUnit::getGigawatt();
+    measureUnit.adoptInstead(MeasureUnit::createHorsepower(status));
+    measureUnitValue = MeasureUnit::getHorsepower();
+    measureUnit.adoptInstead(MeasureUnit::createKilowatt(status));
+    measureUnitValue = MeasureUnit::getKilowatt();
+    measureUnit.adoptInstead(MeasureUnit::createMegawatt(status));
+    measureUnitValue = MeasureUnit::getMegawatt();
+    measureUnit.adoptInstead(MeasureUnit::createMilliwatt(status));
+    measureUnitValue = MeasureUnit::getMilliwatt();
+    measureUnit.adoptInstead(MeasureUnit::createWatt(status));
+    measureUnitValue = MeasureUnit::getWatt();
+    measureUnit.adoptInstead(MeasureUnit::createAtmosphere(status));
+    measureUnitValue = MeasureUnit::getAtmosphere();
+    measureUnit.adoptInstead(MeasureUnit::createHectopascal(status));
+    measureUnitValue = MeasureUnit::getHectopascal();
+    measureUnit.adoptInstead(MeasureUnit::createInchHg(status));
+    measureUnitValue = MeasureUnit::getInchHg();
+    measureUnit.adoptInstead(MeasureUnit::createMillibar(status));
+    measureUnitValue = MeasureUnit::getMillibar();
+    measureUnit.adoptInstead(MeasureUnit::createMillimeterOfMercury(status));
+    measureUnitValue = MeasureUnit::getMillimeterOfMercury();
+    measureUnit.adoptInstead(MeasureUnit::createPoundPerSquareInch(status));
+    measureUnitValue = MeasureUnit::getPoundPerSquareInch();
+    measureUnit.adoptInstead(MeasureUnit::createKilometerPerHour(status));
+    measureUnitValue = MeasureUnit::getKilometerPerHour();
+    measureUnit.adoptInstead(MeasureUnit::createKnot(status));
+    measureUnitValue = MeasureUnit::getKnot();
+    measureUnit.adoptInstead(MeasureUnit::createMeterPerSecond(status));
+    measureUnitValue = MeasureUnit::getMeterPerSecond();
+    measureUnit.adoptInstead(MeasureUnit::createMilePerHour(status));
+    measureUnitValue = MeasureUnit::getMilePerHour();
+    measureUnit.adoptInstead(MeasureUnit::createCelsius(status));
+    measureUnitValue = MeasureUnit::getCelsius();
+    measureUnit.adoptInstead(MeasureUnit::createFahrenheit(status));
+    measureUnitValue = MeasureUnit::getFahrenheit();
+    measureUnit.adoptInstead(MeasureUnit::createGenericTemperature(status));
+    measureUnitValue = MeasureUnit::getGenericTemperature();
+    measureUnit.adoptInstead(MeasureUnit::createKelvin(status));
+    measureUnitValue = MeasureUnit::getKelvin();
+    measureUnit.adoptInstead(MeasureUnit::createAcreFoot(status));
+    measureUnitValue = MeasureUnit::getAcreFoot();
+    measureUnit.adoptInstead(MeasureUnit::createBushel(status));
+    measureUnitValue = MeasureUnit::getBushel();
+    measureUnit.adoptInstead(MeasureUnit::createCentiliter(status));
+    measureUnitValue = MeasureUnit::getCentiliter();
+    measureUnit.adoptInstead(MeasureUnit::createCubicCentimeter(status));
+    measureUnitValue = MeasureUnit::getCubicCentimeter();
+    measureUnit.adoptInstead(MeasureUnit::createCubicFoot(status));
+    measureUnitValue = MeasureUnit::getCubicFoot();
+    measureUnit.adoptInstead(MeasureUnit::createCubicInch(status));
+    measureUnitValue = MeasureUnit::getCubicInch();
+    measureUnit.adoptInstead(MeasureUnit::createCubicKilometer(status));
+    measureUnitValue = MeasureUnit::getCubicKilometer();
+    measureUnit.adoptInstead(MeasureUnit::createCubicMeter(status));
+    measureUnitValue = MeasureUnit::getCubicMeter();
+    measureUnit.adoptInstead(MeasureUnit::createCubicMile(status));
+    measureUnitValue = MeasureUnit::getCubicMile();
+    measureUnit.adoptInstead(MeasureUnit::createCubicYard(status));
+    measureUnitValue = MeasureUnit::getCubicYard();
+    measureUnit.adoptInstead(MeasureUnit::createCup(status));
+    measureUnitValue = MeasureUnit::getCup();
+    measureUnit.adoptInstead(MeasureUnit::createCupMetric(status));
+    measureUnitValue = MeasureUnit::getCupMetric();
+    measureUnit.adoptInstead(MeasureUnit::createDeciliter(status));
+    measureUnitValue = MeasureUnit::getDeciliter();
+    measureUnit.adoptInstead(MeasureUnit::createFluidOunce(status));
+    measureUnitValue = MeasureUnit::getFluidOunce();
+    measureUnit.adoptInstead(MeasureUnit::createGallon(status));
+    measureUnitValue = MeasureUnit::getGallon();
+    measureUnit.adoptInstead(MeasureUnit::createGallonImperial(status));
+    measureUnitValue = MeasureUnit::getGallonImperial();
+    measureUnit.adoptInstead(MeasureUnit::createHectoliter(status));
+    measureUnitValue = MeasureUnit::getHectoliter();
+    measureUnit.adoptInstead(MeasureUnit::createLiter(status));
+    measureUnitValue = MeasureUnit::getLiter();
+    measureUnit.adoptInstead(MeasureUnit::createMegaliter(status));
+    measureUnitValue = MeasureUnit::getMegaliter();
+    measureUnit.adoptInstead(MeasureUnit::createMilliliter(status));
+    measureUnitValue = MeasureUnit::getMilliliter();
+    measureUnit.adoptInstead(MeasureUnit::createPint(status));
+    measureUnitValue = MeasureUnit::getPint();
+    measureUnit.adoptInstead(MeasureUnit::createPintMetric(status));
+    measureUnitValue = MeasureUnit::getPintMetric();
+    measureUnit.adoptInstead(MeasureUnit::createQuart(status));
+    measureUnitValue = MeasureUnit::getQuart();
+    measureUnit.adoptInstead(MeasureUnit::createTablespoon(status));
+    measureUnitValue = MeasureUnit::getTablespoon();
+    measureUnit.adoptInstead(MeasureUnit::createTeaspoon(status));
+    measureUnitValue = MeasureUnit::getTeaspoon();
+    assertSuccess("", status);
+}
+
 void MeasureFormatTest::TestBasic() {
     UErrorCode status = U_ZERO_ERROR;
     MeasureUnit *ptr1 = MeasureUnit::createArcMinute(status);
diff --git a/icu4c/source/test/intltest/numbertest_api.cpp b/icu4c/source/test/intltest/numbertest_api.cpp
index b413a20..910818e 100644
--- a/icu4c/source/test/intltest/numbertest_api.cpp
+++ b/icu4c/source/test/intltest/numbertest_api.cpp
@@ -430,7 +430,7 @@
     assertFormatDescending(
             u"Meters Short and unit() method",
             u"measure-unit/length-meter",
-            NumberFormatter::with().unit(METER),
+            NumberFormatter::with().unit(MeasureUnit::getMeter()),
             Locale::getEnglish(),
             u"87,650 m",
             u"8,765 m",
diff --git a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/MeasureUnitTest.java b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/MeasureUnitTest.java
index 4efc18a..c843e9a 100644
--- a/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/MeasureUnitTest.java
+++ b/icu4j/main/tests/core/src/com/ibm/icu/dev/test/format/MeasureUnitTest.java
@@ -70,7 +70,7 @@
             if (first == null || second == null) {
                 throw new IllegalArgumentException("OrderedPair.of requires non null values.");
             }
-            return new OrderedPair<F, S>(first, second);
+            return new OrderedPair<>(first, second);
         }
 
         @Override
@@ -85,9 +85,9 @@
 
     private static final String[] DRAFT_VERSIONS = {"61", "62", "63"};
 
-    private static final HashSet<String> DRAFT_VERSION_SET = new HashSet<String>();
+    private static final HashSet<String> DRAFT_VERSION_SET = new HashSet<>();
 
-    private static final HashSet<String> TIME_CODES = new HashSet<String>();
+    private static final HashSet<String> TIME_CODES = new HashSet<>();
 
     private static final String[][] JAVA_VERSIONS = {
         {"G_FORCE", "53"},
@@ -231,7 +231,7 @@
         {"ATMOSPHERE", "63"},
     };
 
-    private static final HashMap<String, String> JAVA_VERSION_MAP = new HashMap<String, String>();
+    private static final HashMap<String, String> JAVA_VERSION_MAP = new HashMap<>();
 
     static {
         TIME_CODES.add("year");
@@ -1616,7 +1616,7 @@
     }
 
     static void assertUnique(Collection<?> coll) {
-        int expectedSize = new HashSet<Object>(coll).size();
+        int expectedSize = new HashSet<>(coll).size();
         int actualSize = coll.size();
         assertEquals("Collection should contain only unique elements", expectedSize, actualSize);
     }
@@ -1966,14 +1966,14 @@
 
     @Test
     public void testOldFormatWithList() {
-        List<Measure> measures = new ArrayList<Measure>(2);
+        List<Measure> measures = new ArrayList<>(2);
         measures.add(new Measure(5, MeasureUnit.ACRE));
         measures.add(new Measure(3000, MeasureUnit.SQUARE_FOOT));
         MeasureFormat fmt = MeasureFormat.getInstance(
                 ULocale.ENGLISH, FormatWidth.WIDE);
         assertEquals("", "5 acres, 3,000 square feet", fmt.format(measures));
         assertEquals("", "5 acres", fmt.format(measures.subList(0, 1)));
-        List<String> badList = new ArrayList<String>();
+        List<String> badList = new ArrayList<>();
         badList.add("be");
         badList.add("you");
         try {
@@ -2148,7 +2148,7 @@
 
     @Test
     public void testCLDRUnitAvailability() {
-        Set<MeasureUnit> knownUnits = new HashSet<MeasureUnit>();
+        Set<MeasureUnit> knownUnits = new HashSet<>();
         Class cMeasureUnit, cTimeUnit;
         try {
             cMeasureUnit = Class.forName("com.ibm.icu.util.MeasureUnit");
@@ -2198,8 +2198,8 @@
     static Map<MeasureUnit, Pair<MeasureUnit, MeasureUnit>> getUnitsToPerParts() {
         TreeMap<String, List<MeasureUnit>> allUnits = getAllUnits();
         Map<MeasureUnit, Pair<String, String>> unitsToPerStrings =
-                new HashMap<MeasureUnit, Pair<String, String>>();
-        Map<String, MeasureUnit> namesToUnits = new HashMap<String, MeasureUnit>();
+                new HashMap<>();
+        Map<String, MeasureUnit> namesToUnits = new HashMap<>();
         for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
             String type = entry.getKey();
             // Currency types are always atomic units, so we can skip these
@@ -2217,7 +2217,7 @@
             }
         }
         Map<MeasureUnit, Pair<MeasureUnit, MeasureUnit>> unitsToPerUnits =
-                new HashMap<MeasureUnit, Pair<MeasureUnit, MeasureUnit>>();
+                new HashMap<>();
         for (Map.Entry<MeasureUnit, Pair<String, String>> entry : unitsToPerStrings.entrySet()) {
             Pair<String, String> perStrings = entry.getValue();
             MeasureUnit unit = namesToUnits.get(perStrings.first);
@@ -2232,7 +2232,7 @@
     // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code
     // for MeasureFormat during the release process.
     static void generateCXXHConstants(String thisVersion) {
-        Map<String, MeasureUnit> seen = new HashMap<String, MeasureUnit>();
+        Map<String, MeasureUnit> seen = new HashMap<>();
         System.out.println();
         TreeMap<String, List<MeasureUnit>> allUnits = getAllUnits();
         for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
@@ -2249,8 +2249,9 @@
                     System.out.println("#ifndef U_HIDE_DRAFT_API");
                 }
                 System.out.println("    /**");
-                System.out.println("     * Returns unit of " + type + ": " + code + ".");
+                System.out.println("     * Returns by pointer, unit of " + type + ": " + code + ".");
                 System.out.println("     * Caller owns returned value and must free it.");
+                System.out.printf("     * Also see {@link #get%s()}.\n", name);
                 System.out.println("     * @param status ICU error code.");
                 if (isDraft(javaName)) {
                     System.out.println("     * @draft ICU " + getVersion(javaName, thisVersion));
@@ -2259,6 +2260,19 @@
                 }
                 System.out.println("     */");
                 System.out.printf("    static MeasureUnit *create%s(UErrorCode &status);\n", name);
+                System.out.println();
+                System.out.println("    /**");
+                System.out.println("     * Returns by value, unit of " + type + ": " + code + ".");
+                System.out.printf("     * Also see {@link #create%s()}.\n", name);
+                // TODO: When the get* methods become stable in ICU 66, update their
+                // @draft code to be more like that for the create* methods above.
+                String getterVersion = getVersion(javaName, thisVersion);
+                if (Integer.valueOf(getterVersion) < 64) {
+                    getterVersion = "64";
+                }
+                System.out.println("     * @draft ICU " + getterVersion);
+                System.out.println("     */");
+                System.out.printf("    static MeasureUnit get%s();\n", name);
                 if (isDraft(javaName)) {
                     System.out.println("#endif /* U_HIDE_DRAFT_API */");
                 }
@@ -2280,7 +2294,7 @@
     // for MeasureFormat during the release process.
     static void updateJAVAVersions(String thisVersion) {
         System.out.println();
-        Map<String, MeasureUnit> seen = new HashMap<String, MeasureUnit>();
+        Map<String, MeasureUnit> seen = new HashMap<>();
         TreeMap<String, List<MeasureUnit>> allUnits = getAllUnits();
         for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
             String type = entry.getKey();
@@ -2298,9 +2312,9 @@
     }
 
     static TreeMap<String, List<MeasureUnit>> getAllUnits() {
-        TreeMap<String, List<MeasureUnit>> allUnits = new TreeMap<String, List<MeasureUnit>>();
+        TreeMap<String, List<MeasureUnit>> allUnits = new TreeMap<>();
         for (String type : MeasureUnit.getAvailableTypes()) {
-            ArrayList<MeasureUnit> units = new ArrayList<MeasureUnit>(MeasureUnit.getAvailable(type));
+            ArrayList<MeasureUnit> units = new ArrayList<>(MeasureUnit.getAvailable(type));
             Collections.sort(
                     units,
                     new Comparator<MeasureUnit>() {
@@ -2366,9 +2380,9 @@
         first = true;
         int offset = 0;
         int typeIdx = 0;
-        Map<MeasureUnit, Integer> measureUnitToOffset = new HashMap<MeasureUnit, Integer>();
+        Map<MeasureUnit, Integer> measureUnitToOffset = new HashMap<>();
         Map<MeasureUnit, Pair<Integer, Integer>> measureUnitToTypeSubType =
-                new HashMap<MeasureUnit, Pair<Integer, Integer>>();
+                new HashMap<>();
         for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
             int subTypeIdx = 0;
             for (MeasureUnit unit : entry.getValue()) {
@@ -2395,7 +2409,7 @@
         // Build unit per unit offsets to corresponding type sub types sorted by
         // unit first and then per unit.
         TreeMap<OrderedPair<Integer, Integer>, Pair<Integer, Integer>> unitPerUnitOffsetsToTypeSubType
-                = new TreeMap<OrderedPair<Integer, Integer>, Pair<Integer, Integer>>();
+                = new TreeMap<>();
         for (Map.Entry<MeasureUnit, Pair<MeasureUnit, MeasureUnit>> entry
                 : getUnitsToPerParts().entrySet()) {
             Pair<MeasureUnit, MeasureUnit> unitPerUnit = entry.getValue();
@@ -2433,7 +2447,7 @@
         System.out.println("static const int32_t kBaseSubTypeIdx = " + baseSubTypeIdx + ";");
         System.out.println();
 
-        Map<String, MeasureUnit> seen = new HashMap<String, MeasureUnit>();
+        Map<String, MeasureUnit> seen = new HashMap<>();
         for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
 
             String type = entry.getKey();
@@ -2452,6 +2466,11 @@
                         typeSubType.first, typeSubType.second);
                 System.out.println("}");
                 System.out.println();
+                System.out.printf("MeasureUnit MeasureUnit::get%s() {\n", name);
+                System.out.printf("    return MeasureUnit(%d, %d);\n",
+                        typeSubType.first, typeSubType.second);
+                System.out.println("}");
+                System.out.println();
             }
         }
     }
@@ -2491,7 +2510,7 @@
     // DO NOT DELETE THIS FUNCTION! It may appear as dead code, but we use this to generate code
     // for MeasureFormat during the release process.
     static void generateBackwardCompatibilityTest(String version) {
-        Map<String, MeasureUnit> seen = new HashMap<String, MeasureUnit>();
+        Map<String, MeasureUnit> seen = new HashMap<>();
         System.out.println();
         System.out.printf("    public void TestCompatible%s() {\n", version.replace(".", "_"));
         System.out.println("        MeasureUnit[] units = {");
@@ -2517,10 +2536,11 @@
     // for MeasureFormat during the release process.
     static void generateCXXBackwardCompatibilityTest(String version) {
         System.out.println();
-        Map<String, MeasureUnit> seen = new HashMap<String, MeasureUnit>();
+        Map<String, MeasureUnit> seen = new HashMap<>();
         System.out.printf("void MeasureFormatTest::TestCompatible%s() {\n", version.replace(".", "_"));
         System.out.println("    UErrorCode status = U_ZERO_ERROR;");
         System.out.println("    LocalPointer<MeasureUnit> measureUnit;");
+        System.out.println("    MeasureUnit measureUnitValue;");
         TreeMap<String, List<MeasureUnit>> allUnits = getAllUnits();
         for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
             if (isTypeHidden(entry.getKey())) {
@@ -2530,6 +2550,7 @@
                 String camelCase = toCamelCase(unit);
                 checkForDup(seen, camelCase, unit);
                 System.out.printf("    measureUnit.adoptInstead(MeasureUnit::create%s(status));\n", camelCase);
+                System.out.printf("    measureUnitValue = MeasureUnit::get%s();\n", camelCase);
             }
         }
         System.out.println("    assertSuccess(\"\", status);");
@@ -2560,7 +2581,7 @@
     // for MeasureFormat during the release process.
     static void generateConstants(String thisVersion) {
         System.out.println();
-        Map<String, MeasureUnit> seen = new HashMap<String, MeasureUnit>();
+        Map<String, MeasureUnit> seen = new HashMap<>();
         TreeMap<String, List<MeasureUnit>> allUnits = getAllUnits();
         for (Map.Entry<String, List<MeasureUnit>> entry : allUnits.entrySet()) {
             String type = entry.getKey();