Один из популярных случаев использования сопоставления с образцом с помощью переключателя — это работа с различными типами данных в программе. Рассмотрим следующий пример класса WeatherStation, который имеет разные типы датчиков и возвращает текущую температуру:
`публичный класс WeatherStation {
private Sensor sensor; public double getCurrentTemperature() { return switch (sensor) { case TemperatureSensor t -> t.reading(); case HumiditySensor h -> h.reading() * 0.9; // apply a 10% moisture correction default -> 0.0; // in case of an unhandled sensor type, return 0 }; }
}
`
Здесь мы видим, что интерфейс датчика используется для выражения селектора, а метки регистра используют шаблоны, основанные на конкретных реализациях датчика: датчик температуры и датчик влажности. Это обеспечивает более краткий и читаемый способ обработки различных типов данных в операторе переключения.
Другой вариант использования сопоставления с образцом с помощью переключателя — это работа с перечислениями. До того, как было введено сопоставление с образцом, перечисления можно было использовать только в качестве констант в метках регистра, что ограничивало значения, которые можно было проверить в операторе переключения. Благодаря новой функции перечисления теперь можно уточнять по меткам регистра, что обеспечивает более точное и гибкое сопоставление.
public enum Direction {
СЕВЕР,
ВОСТОК,
ЮГ,
ЗАПАД
}
public void move(Направление) {
переключатель (направление) {
случай NORTH,NORTH_WEST,NORTH_EAST -> moveUp();
случай EAST,EAST_NORTH,EAST_SOUTH -> moveRight();
case SOUTH,SOUTH_EAST,SOUTH_WEST -> moveDown();
случай WEST,WEST_NORTH,WEST_SOUTH -> moveLeft();
}
}
Здесь метод move() использует оператор переключения, чтобы легко обрабатывать перемещение в разных направлениях на основе указанного значения перечисления Direction. С помощью сопоставления с образцом мы также можем указать комбинации направлений, такие как NORTH_WEST и EAST_SOUTH, что делает наш код более надежным и гибким.
Наконец, давайте посмотрим на пример того, как сопоставление с образцом может помочь при обработке ошибок в операторе переключения. В традиционном переключателе, если выражение селектора не соответствует ни одной из меток регистра, для обработки ошибки можно использовать регистр по умолчанию. Однако это может быть утомительно при работе с несколькими метками регистра и может привести к дублированию кода. При сопоставлении с образцом выдается исключение, если ни один из шаблонов меток регистра не соответствует выражению селектора, что делает обработку ошибок более единообразной и менее подверженной ошибкам.
public String getPlanetaryObject(тело PlanetaryBody) {
переключатель возврата (тело) {
case Planet p && p.getMass() > 1e29 -> p.getName() "является газовым гигантом";
case Planet p && p.getMass() > 1e23 -> p.getName() "является каменистой планетой";
case Star s && s.getLuminosity() > 1e32 -> s.getName() "является яркой звездой";
case Star s && s.getLuminosity() s.getName() "является тусклой звездой";
default -> throw new MatchException("Невозможно определить тип планетарного объекта: " body.getName());
};
}
В этом примере метод getPlanetaryObject() принимает объект PlanetaryBody, который может быть планетой или звездой. Шаблоны, используемые в этикетках корпусов, учитывают дополнительные условия, такие как масса планеты или светимость звезды. Если ни один из шаблонов не соответствует, создается исключение MatchException, что делает обработку ошибок более последовательной и предотвращает любые потенциальные ошибки.
Заключение
Сопоставление шаблонов для переключателей — одна из наиболее важных функций, появившихся в Java в последнее время. Это позволяет создавать более гибкие и лаконичные структуры потока управления.
Повысьте свои навыки работы с Java, пройдя сертификацию профессионального сертифицированного разработчика Java SE 21.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3