Я новичок в stackoverflow.com, но я часто использовал его для поиска ответов, когда у меня была проблема, но теперь я не могу найти результат поиска моей проблемы, поэтому я спрашивая здесь :) Я изучаю сертификацию OCPJP SE 7, экзамен 1Z0-804, и я использую книгу (есть только один доступный afaik, Ganesh \ Sharma's) В главе коллекций о компараторе интерфейс, книга обеспечить этот пример использования как компаратора и Сопоставимый интерфейса для сортировки массива студенческих элементов, но вопрос о компараторе:Интерфейс компаратора реализован во вложенном классе
import java.util.*;
class Student implements Comparable<Student> {
private String id, name;
private Double cgpa;
public String getName() {
return name;
}
public String getId() {
return id;
}
public Double getCgpa() {
return cgpa;
}
public Student(String studentId, String studentName, double studentCGPA) {
id=studentId;
name=studentName;
cgpa=studentCGPA;
}
public String toString() {
return id+" "+name+" "+cgpa;
}
public int compareTo(Student that) {
return this.id.compareTo(that.id);
}
}
class StudentCGPA implements Comparator<Student> {
public int compare(Student s1, Student s2) {
return s1.getCgpa().compareTo(s2.getCgpa());
}
}
class MyMainClass {
public static void main(String[] args) {
Student[] students = { new Student("cs011", "Lennon", 3.1),
new Student("cs021", "McCartney", 3.4),
new Student("cs012", "Harrison", 2.7),
new Student("cs022", "Starr", 3.7),
};
Arrays.sort(students, new StudentCGPA());
System.out.println(Arrays.toString(students));
}
}
Так он создает новый класс только для USI ng интерфейс Comparator с двумя объектами Student, но я думаю, что это очень неудобно, поэтому мне интересно: почему я не могу использовать вложенный класс (внутри Student)? Как это:
import java.util.*;
class Student implements Comparable<Student> {
private String id, name;
private Double cgpa;
public String getName() {
return name;
}
public String getId() {
return id;
}
public Double getCgpa() {
return cgpa;
}
public Student(String studentId, String studentName, double studentCGPA) {
id=studentId;
name=studentName;
cgpa=studentCGPA;
}
public String toString() {
return id+" "+name+" "+cgpa;
}
public int compareTo(Student that) {
return this.id.compareTo(that.id);
}
static class StudentCGPA implements Comparator<Student> {
public int compare(Student s1, Student s2) {
return s1.getCgpa().compareTo(s2.getCgpa());
}
}
}
class MyMainClass {
public static void main(String[] args) {
Student[] students = { new Student("cs011", "Lennon", 3.1),
new Student("cs021", "McCartney", 3.4),
new Student("cs012", "Harrison", 2.7),
new Student("cs022", "Starr", 3.7),
};
Arrays.sort(students, new Student.StudentCGPA());
System.out.println(Arrays.toString(students));
}
}
Книга ничего не говорит об использовании вложенных классов вместо нормальных, но я не могу понять, почему это должно быть плохо, чтобы сделать как это ... Есть ли какие-либо проблемы с моим кодом (2-й)? Должен ли я следовать тому, что говорит книга, потому что моя реализация Компаратора ошибочна? (Примечание: код компилируется и работает без проблем, с ожидаемым выходом в обоих случаях)
[cs012 Harrison 2.7, cs011 Lennon 3.1, cs021 McCartney 3.4, cs022 Starr 3.7]
Пожалуйста, помогите: D Спасибо заранее.
Несколько классов на единицу компиляции являются фактически непринужденной функцией Java. Вы всегда должны предпочесть вложенные классы. –
Если вы используете отдельный «Comparator», тогда хорошая практика - поместить его источник в отдельный файл. Это не аргумент за или против вложенности класса 'Comparator'. Очень вероятно, что ** книга **, из которой вырисовывается исходный источник, представляет ее так же, как и для удобства и ясности. –