如果我要在一个必须存储欧洲所有国家(以及它们各自的城市)的应用程序中使用哪种方法,那将是一个好方法?
我考虑过使用枚举来存储信息,但是由于那需要我对大量数据进行硬编码,因此我很快就放弃了这个想法。
之后,我考虑了类似的东西:
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.FRANCE
或Country.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);
}