#java
#java
Вопрос:
У меня есть абстрактный класс с методом, который загружает данные с сайта и возвращает метод, который работает с полученными данными
protected final FormatRate load(String urlToSite, SiteLoader.Currency currencyName){
StringBuilder content;
boolean error;
int retryCount = 0;
do{
content = new StringBuilder();
error = false;
try {
// create a url object
HttpURLConnection con = (HttpURLConnection) new URL(urlToSite).openConnection();
con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0");
con.setConnectTimeout(50000); //set timeout to 50 seconds
con.setReadTimeout(50000); //set timeout to 50 seconds
try(BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(con.getInputStream()))){
String line;
while ((line = bufferedReader.readLine()) != null)
{
content.append(line).append("n");
}
}
}
catch(Exception e)
{
error = true;
retryCount ;
System.err.println("" e.getMessage());
}
} while (error amp;amp; retryCount < 5);
if(error){
throw new RuntimeException("");
}
return handle(content.toString(), currencyName);
}
Это мой дескриптор метода:
protected abstract FormatRate handle(String content, Currency currencyName);
И его реализация:
@Override
protected FormatRate handle(String content, Currency currencyName) {
int indexRate = content.indexOf(strForRate);
int indexDate = content.indexOf(strForDate);
int indexScale = content.indexOf(strForScale);
int indexAbbreviation = content.indexOf(strForAbbreviation);
String scale = "";
if (currencyName.getId().equals(Currency.RUB.getId())) {
scale = content.substring(indexScale 11, indexScale 14);
} else {
scale = content.substring(indexScale 11, indexScale 12);
}
return new FormatRate(content.substring(indexRate 18, indexRate 24),
scale,
content.substring(indexAbbreviation 19, indexAbbreviation 22),
content.substring(indexDate 7, indexDate 26));
}
Мой вопрос: мне нужно добавить новый метод handle
, который вернет коллекцию. Он будет вызываться при вызове метода load
с тремя параметрами. Я не понимаю, как это реализовать…
Методы load
также объявляются абстрактными в классе
@Override
public FormatRate load(Currency currencyName) {
return load("https://www.nbrb.by/api/exrates/rates/" currencyName.getId(), currencyName);
}
@Override
public FormatRate load(Currency currencyName, String date) {
return load("https://www.nbrb.by/api/exrates/rates/" currencyName.getId() "?ondate=" date, currencyName);
}
@Override
public FormatRate load(Currency currencyName, String dateFrom, String dateTo) {
return load("https://www.nbrb.by/api/exrates/rates/dynamics/" currencyName.getId()
"?startDate=" dateFrom "amp;endDate=" dateTo, currencyName);
}
Комментарии:
1. Вам нужно перегрузить метод
handle
и изменить тип значения, которое возвращает метод? Перегруженный метод должен возвращатьсяCollection
, а неFormatRate
?2. @Abra Да, это верно. Метод должен возвращать a
Set<FormatRate>
. И в методеload
handle
вызывается нужный мне метод3. Вы не можете перегружать методы разными типами возвращаемых данных. Вы можете перегружать методы только с разным количеством параметров или разными типами параметров.
4. @Abra Я понимаю, что мне нужно изменить аргументы для метода перегрузки, но я не могу понять, как я могу вернуть один из моих методов ‘handle’.