При чтении сообщения блога разработчиков Android на месте я наткнулся на этот бит кода (вырезать и вставить из блога):
List<String> matchingProviders = locationManager.getAllProviders();
for (String provider: matchingProviders) {
Location location = locationManager.getLastKnownLocation(provider);
if (location != null) {
float accuracy = location.getAccuracy();
long time = location.getTime();
if ((time > minTime && accuracy < bestAccuracy)) {
bestResult = location;
bestAccuracy = accuracy;
bestTime = time;
}
else if (time < minTime &&
bestAccuracy == Float.MAX_VALUE && time > bestTime){
bestResult = location;
bestTime = time;
}
}
}
В то время как остальное довольно ясно, эта строка меня озадачила:
else if (time < minTime &&
bestAccuracy == Float.MAX_VALUE && time > bestTime){
"время" должно быть в пределах приемлемого периода ожидания и более позднего, чем предыдущее лучшее время. В этом есть смысл.
Но что означает сравнение bestAccuracy с значением Max Float? Когда точность будет точно равна максимальному значению, которое может содержать float?
Этот конкретный бит имеет больше смысла, если вы следуете его ссылке на весь исходный файл. Здесь немного больший фрагмент:
Location bestResult = null;
float bestAccuracy = Float.MAX_VALUE;
long bestTime = Long.MIN_VALUE;
// Iterate through all the providers on the system, keeping
// note of the most accurate result within the acceptable time limit.
// If no result is found within maxTime, return the newest Location.
List<String> matchingProviders = locationManager.getAllProviders();
for (String provider: matchingProviders) {
Location location = locationManager.getLastKnownLocation(provider);
if (location != null) {
float accuracy = location.getAccuracy();
long time = location.getTime();
if ((time > minTime && accuracy < bestAccuracy)) {
bestResult = location;
bestAccuracy = accuracy;
bestTime = time;
}
else if (time < minTime && bestAccuracy == Float.MAX_VALUE && time > bestTime) {
bestResult = location;
bestTime = time;
}
}
}
Очень просто, Float.MAX_VALUE
является его значением по умолчанию для bestAccuracy
и он просто проверяет, что он не уменьшил его в предыдущем предложении if
.
Я предполагаю, что bestAccuracy
был инициализирован Float.MAX_VALUE. Если это так, то код можно суммировать как: найти провайдера с наименьшей (лучшей?) Точностью со временем больше minTime. Если время больше, чем minTime, тогда просто возьмите тот, который находится ближе всего к minTime.
Это может быть реорганизовано из
if ((time < minTime && accuracy < bestAccuracy)) {
bestResult = location;
bestAccuracy = accuracy;
bestTime = time;
}
else if (time > minTime && bestAccuracy == Float.MAX_VALUE && time < bestTime) {
bestResult = location;
bestTime = time;
}
в
if ((time < minTime && accuracy < bestAccuracy)) {
bestResult = location;
bestAccuracy = accuracy;
bestTime = time;
foundWithinTimeLimit = true;
}
else if (time > minTime && !foundWithinTimeLimit && time < bestTime) {
bestResult = location;
bestTime = time;
}
делает его немного яснее.