Comparateur Interface implémentée dans une classe imbriquée

Je suis nouveau sur stackoverflow.com mais j'ai souvent utilisé pour trouver des réponses à chaque fois que j'avais un problème, mais maintenant je ne trouve pas de résultat de recherche pour mon problème donc je pose la question ici 🙂
Je fais les études pour la OCPJP SE 7 de certification, examen 1Z0-804, et je suis à l'aide d'un livre (il y a seulement un de disponible autant que je sache, Ganesh\Sharma)
Dans les collections du chapitre, au sujet de la Comparaison de l'interface, le livre de fournir cet exemple d'utiliser à la fois le Comparateur et l'interface Comparable pour trier un tableau de l'Étudiant les éléments, mais la question est sur le Comparateur de:

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));
}
}

De sorte qu'il crée une nouvelle classe seulement pour l'utilisation du Comparateur de l'interface avec deux Étudiants objets, mais je pense que c'est très mal à l'aise alors je me demande: pourquoi ne puis-je pas utiliser une classe imbriquée (au sein de l'Étudiant)? Comme ceci:

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));
}
}

Le livre ne dit rien à propos de l'utilisation de classes imbriquées au lieu de la normale, mais je ne vois pas pourquoi il devrait en être de mauvais à faire comme ça... Est-il un problème avec mon code (le 2ème)? Dois-je suivre ce que le livre dit, parce que ma mise en œuvre de la Comparaison est mal? (Note: le code se compile et s'exécute sans problème, avec la sortie attendue dans les deux cas)

[cs012 Harrison 2.7, cs011 Lennon 3.1, cs021 McCartney 3.4, cs022 Starr 3.7]

S'il vous plaît aider 😀 Merci d'avance.

Plusieurs classes par unité de compilation sont pratiquement obsolète fonctionnalité de Java. Vous devez toujours préférer classes imbriquées.
Si vous utilisez un Comparator, alors c'est bien pratique pour mettre sa source dans un fichier séparé. Ce n'est pas un argument pour ou contre la nidification de la Comparator classe. Très probablement, la livre à partir de laquelle la source d'origine est tracée la présente comme il le fait pour des raisons de commodité et de clarté.

OriginalL'auteur RaffoSorr | 2014-10-07