JAVA методов в том же классе и той же реализации, но разные типы объектов в качестве параметра - PullRequest
0 голосов
/ 13 января 2020

Каков лучший способ в java иметь дело с тремя методами в того же класса с такой же имплантацией , но другой тип объекта в качестве параметра как я не люблю дублировать код хорошо или возможно иметь один метод с параметром как Set

EX:

public static String M1(Set<Book> set) {
    Iterator<Book> first = set.iterator();
    String id1 = "";
    while (first.hasNext()) {
         id1 = first.next().getName();
        if (id1.equalsIgnoreCase("ABC")) {
    return id1 ;
        }
    }
    return id1 ;

}

public static String M2(Set<Student> set) {

Iterator<Student> first = set.iterator();
    String id1 = "";
    while (first.hasNext()) {
         id1 = first.next().getName();
        if (id1.equalsIgnoreCase("ABC")) {
    return id1 ;
        }
    }
    return id1 ;

}

public static String M3(Set<Course> set) {

    Iterator<Course> first = set.iterator();
    String id1 = "";
    while (first.hasNext()) {
         id1 = first.next().getName();
        if (id1.equalsIgnoreCase("ABC")) {
    return id1 ;
        }
    }
    return id1 ;

}

Ответы [ 2 ]

3 голосов
/ 13 января 2020

В идеале ваши классы Book, Student и Course должны реализовывать общий интерфейс, обеспечивающий доступ к методу getName(). Затем вы можете сделать это:

public static String M(Set<? extends HasName> set) {

    Iterator<? extends HasName> first = set.iterator();
    String id1 = "";
    while (first.hasNext()) {
         id1 = first.next().getName();
        if (id1.equalsIgnoreCase("ABC")) {
    return id1 ;
        }
    }
    return id1 ;

}

Обратите внимание, что здесь будет лучше для расширенного для l oop:

String id1 = "";
for (HasName n : set) {
  id1 = n.getName();
  if (id1.equalsIgnoreCase("ABC")) { return id1; }
}
return id1;

Если нет, вы все равно можете определить один метод, содержащий логи c:

public static <T> String common(Set<T> set, Function<? super T, String> extractor) {

    Iterator<T> first = set.iterator();
    String id1 = "";
    while (first.hasNext()) {
         id1 = extractor.apply(first.next());
        if (id1.equalsIgnoreCase("ABC")) {
    return id1 ;
        }
    }
    return id1 ;

}

Затем вам нужно либо вызвать его напрямую:

String fromBook = common(setOfBooks, Book::getName);

или предоставить методы для вызова общего метода:

String M1(Set<Book> set) {
  return common(set, Book::getName);
}

String M2(Set<Student> set) {
  return common(set, Student::getName);
}

String M3(Set<Course> set) {
  return common(set, Course::getName);
}

Обратите внимание, что они должны иметь разные имена из-за стирания типа.

1 голос
/ 13 января 2020

Ну, с некоторой точки зрения да, вы можете. Хотя требуется дополнительная информация, дженерики - это путь к go. У вас может быть один метод с подписью, такой как:

public <T> String M1(Set<T> t){
    return t.toString();
}

Хотя, пожалуйста, обратите внимание, что вы либо ограничены методом Object, либо вам придется объявить интерфейс с общими функциями и вместо <T> write

<T extends InterfaceName>
...