Java альтернатива плохо выглядящим конструкциям if-else или switch - PullRequest
0 голосов
/ 21 декабря 2018

В поисках современного способа реализовать перевод строк для замены плохо выглядящих конструкций if-else или switch:

if ("UK".equals(country)) 
     name = "United Kingdom";
  if ("GE".equals(country))
     name = "Germany";
  if ("FR".equals(country))
     name = "France";
  if ("IT".equals(country))
     name = "Italy";
  [...]

или

switch (country) {
      case "UK": name = "United Kingdom"; break;
      case "GE": name = "Germany" break;
      case "FR": name = "France"; break;
      case "IT": name = "Italy" break;
  [...]

Ответы [ 4 ]

0 голосов
/ 21 декабря 2018

Я думаю, что самым чистым подходом было бы наследование и введение в ваш код некоторой простой структуры данных для представления такого рода информации.Это предотвратит эскалацию переключателей при расширении кода.Давайте иметь абстрактный базовый класс Country, который предоставляет некоторые атрибуты, такие как «Имя».Имя никогда не изменится и зависит от типа.Итак, мы определяем класс UK, который наследуется от Country.Теперь вы можете использовать полиморфизм и выполнять итерацию по всем странам типа Country и извлекать его имя, используя атрибут «Имя» (только для чтения) без каких-либо переключателей или приведений типов.При добавлении новой страны вам больше не нужно будет касаться такого рода заявлений.

List<String> countries = new ArrayList<>();
countries.Add(new UK());
countries.Add(new Italy());

for (Country country : countries) 
{
  String countryName = country.getName();
}
0 голосов
/ 21 декабря 2018

Еще одна возможность с HashMap:

private final Map<String, String> countries = new HashMap<String, String>() {
  {
     put("UK", "United Kingdom");
     put("GE", "Germany");
     put("FR", "France");
     put("IT", "Italy");
     [...]
  }
};

name = countries.get(county);
0 голосов
/ 21 декабря 2018

Вы можете просто использовать java.util.Map.создать переменную статических стран.

private static final String UK = "UK";
private static final String GE = "GE";
private static final String FR = "FR";
private static final String IT = "IT";

private static final Map<String, String> COUNTRIES;
static {
    final Map<String, String> countries = new HashMap<>();
    countries.put(UK, "United Kingdom");
    countries.put(GE, "Germany");
    countries.put(FR, "France");
    countries.put(IT, "Italy");
    COUNTRIES = Collections.unmodifiableMap(countries);
}

затем можно использовать свойство "get" из java.util.Map для получения названия страны

System.out.println(COUNTRIES.get(UK));
System.out.println(COUNTRIES.get(GE));
System.out.println(COUNTRIES.get(FR));
System.out.println(COUNTRIES.get(IT));
0 голосов
/ 21 декабря 2018

Возможно, вы захотите enum.

public enum Country {
    UK("United Kingdom"),
    GE("Germany"), // sure this isn't DE?
    FR("France");
    // and so on
    private String countryName;
    private Country(String n) { countryName = n; }

    public String getCountryName() { return countryName; }
}

Теперь вы можете

Country c = Country.valueOf(countryString); // throws exception when unknown
name = c.getCountryName();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...