Я полностью согласен с @ luk2302, в том числе значение константы в ее названии - плохая идея.
Однако, учитывая вашу текущую ситуацию, почему бы просто не определить Map
, который является статическим и окончательным.Это почти эквивалентно всем вашим определенным константам, и вы не получите никаких предупреждений от вашей IDE или таких инструментов, как sonar .
. В этом решении мы создаем 2 карты,Первая карта содержит все значения констант, но определяется как private
.Если это объявлено как общедоступное, тогда его значения могут быть изменены и нарушает цель constant
.Чтобы преодолеть эту проблему, мы определяем карту unmodifiable
, которая объявлена в последней строке статического блока.Теперь, выставив только эту карту, никакие мутации на ней невозможны.
Попробуйте:
public class Constant {
private Constant() { } // Can't create obj of this class
// map that contains the constans but not exposed
private static final Map<String, String> mapOfConstants = new HashMap<String, String>();
// unmodifiable map that is exposed
public static Map<String, String> unmodifiableMap;
static {
mapOfConstants.put("yyyyMMdd", "yyyyMMdd");
mapOfConstants.put("yyyy_MM_dd", "yyyy-MM-dd");
mapOfConstants.put("yyyy_MM_dd_Combined", "yyyyMMddHHmm");
mapOfConstants.put("yyyy_MM_dd_HH_mm", "yyyy-MM-dd HH:mm");
mapOfConstants.put("dd_MM_yyyy", "dd-MM-yyyy");
mapOfConstants.put("dd_MM_yyyy_WITH_DOT", "dd.MM.yyyy");
mapOfConstants.put("mm_dd_yyyy_WITH_SLASH", "MM/dd/yyyy");
mapOfConstants.put("m_d_yyyy_WITH_SLASH", "M/d/yyyy");
mapOfConstants.put("dd_mm_yyyy_WITH_SLASH", "dd/MM/yyyy");
mapOfConstants.put("dd_MMM", "ddMMM");
mapOfConstants.put("dd_MM_yy", "ddMMyy");
mapOfConstants.put("dd_MMM_yyyy", "ddMMMyyyy");
mapOfConstants.put("dd_MM_yyyy_COMBINED", "ddMMyyyy");
mapOfConstants.put("dd_MM_yyyy_HH_mm_ss", "yyyy-MM-dd'T'HH:mm:ss");
mapOfConstants.put("dd_MM_yyyy_HH_mm_ss_sz", "yyyy-MM-dd'T'HH:mm:ss.SSS");
mapOfConstants.put("dd_MM_yyyy_HH_mm_ss_sz_XXX", "yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
mapOfConstants.put("dd_MM_yyyy_HH_mm", "dd-MM-yyyy HH:mm");
mapOfConstants.put("HH_mm", "HH:mm");
mapOfConstants.put("YYYY_MM_DDTHH_mm_ssZ", "YYYY-MM-DD'T'HH:mm:ssZ");
// observe this line
unmodifiableMap = Collections.unmodifiableMap(mapOfConstants);
}
}
Теперь вы можете использовать ее в другом классе, например:
public class Test {
public static void main(String[] args) {
Constant.unmodifiableMap.get("dd_MM_yyyy_COMBINED");
// this wouldn't execute
Constant.unmodifiableMap.put("asd", "asdad");
}
}
Вы также не сможете использовать enum , так как он попросит вас определить константы в соответствии с вашим вопросом.