如果我要在一个必须存储欧洲所有国家(以及它们各自的城市)的应用程序中使用哪种方法,那将是一个好方法?

我考虑过使用枚举来存储信息,但是由于那需要我对大量数据进行硬编码,因此我很快就放弃了这个想法。

之后,我考虑了类似的东西:

class Country {

    public Country(String name, City... cities) {
        //Stuff
    }
}


这样,我将能够从.txt中读取城市并相应地创建对象,从而消除了体力劳动的需要。但是,这带来了一个新问题,我应该在哪里存储国家列表?我考虑了以下几点:

class Country {

    public Country(String name, City... cities) {
        //Stuff
    }

    public static List<Country> getAllCountries() {
        return countries;
    }
}


但是我觉得这样的代码会污染项目的结构和整洁度。

我考虑过将枚举(国家/地区)和课程(城市)结合使用,但这也不对。

理想情况下,我希望能够访问枚举Country.FRANCECountry.getByName("France")之类的国家/地区,但在这里似乎都不是解决方案。因此,我回到了最初的问题。什么是执行此操作的好方法?

最佳答案

城市列表很大,很可能您需要的不仅仅是一个国家或城市的名称。将这些信息存储在文件中以供常规使用是不切实际的,并且绝对不能为此进行枚举。取而代之的是,您可以使用一个数据库,该数据库可以填充有Geonames数据。地名数据库包含有关城市位置以及其他更多信息的信息。您可以使用ISO 3166-1 alpha-2代码来识别国家/地区,并使用地理名称ID来引用该国家/地区中的城市。如果要用不同的语言显示国家列表,则还存在国家/地区的本地化名称。

可以从此处下载此数据(说明如下):
http://download.geonames.org/export/dump/

您可以在Github中轻松找到将文件导入到您选择的数据库中的代码-有许多示例可以做到这一点。

使用数据库,您的代码可能如下所示:

class CountryRepository {
    public Country findByISOCode(String code) { ... }
    public List<Country> findAll() {
       // JDBC or JPA query
    }
}

class SomeBusinessLogic {
    private CountryRepository countries;
    private CityRepository cities;
    ...
    Country france = countries.findByISOCode("FR");
    List<City> largestFrenchCities = cities.findTopLargestIn(france, 5);
}

10-08 19:24