#java #enums
Вопрос:
У меня под рукой есть рефакторинг кода, и я вижу несколько методов, которые берут различные объекты перечисления, сравнивают их и выполняют некоторую логику. Большинство из этих методов своего рода идентичны по своей природе, за исключением некоторых незначительных настроек. Например
private void method1(EnumType1 current,EnumType1 desired) {
if (current==desired) {
//perform some logic
}
}
private void method2(EnumType2 current,EnumType2 desired) {
if (current==desired) {
//perform some logic
}
}
фрагмент кода внутри (выполнение некоторой логики может быть заменено шаблоном шаблона, поскольку существует определенная логика, основанная на определенном типе перечисления). Мне интересно, могу ли я создать новый метод для замены вышеперечисленных 2 методов следующим кодом
private void method(Object current,Object desired) {
if(current==desired) {
//perform some logic
}
}
Я хочу знать, правильно ли работает логика»==», когда я использую этот метод для разных типов перечислений (в моем вопросе я дал ссылку на 2 разных типа перечислений — Enum1 и Enum2), например, скажем, 5 разных типов перечислений. Я протестировал эту логику с 3-4 различными классами перечислений с несколькими значениями в ней и обнаружил, что она работает нормально, но также хотел проверить на этом форуме (пока я продолжаю читать больше о перечислениях).
Если вам нужны какие-либо другие подробности по моему вопросу, пожалуйста, дайте мне знать.
Комментарии:
1. Почему бы вам просто не перегрузить свою функцию для разных видов перечислений? Это также сделает его более типобезопасным.
Ответ №1:
Это похоже на случай универсального метода.
private <E extends Enum<E>> void myMethod(E current, E desired) {
if (current == desired) {
....
}
}
Параметр type E
используется для гарантии того, что вы можете передавать этому методу только типы перечислений и только два одного типа, в отличие от двух несвязанных перечислений.
Комментарии:
1. Привет, Давуд, я также наткнулся на определенный дополнительный сценарий, в котором методы принимают пользовательские объекты (например, строку). Я подумываю о повторном использовании того же метода, что и предложенный вами, с помощью Object. Я сделаю некоторые проверки сегодня, но подумал о том, чтобы спросить, хорошо ли звучит это решение?