2016-03-19 8 views
0

Ich lerne das Konzept der comparable und comparator Schnittstelle zu meiner eigenen Klasse Umsetzung, und ich sah in Bezug auf die Erklärung unten von Java Tutorial Orakel auf die beste Praxis der comparable und comparator Umsetzung Schnittstelle:Implementieren von `comparable` und` comparator` interface: Wie überprüft man, ob int Variablen gut gebildet sind oder nicht?

Der Konstruktor überprüft seine Argumente für null. Dies stellt sicher, dass alle Name-Objekte wohlgeformt sind, so dass keine der anderen Methoden jemals eine NullPointerException auslösen wird.

Ich versuche, eine Employee Klasse mit int id, int salary, int age, String name und Date dateOfJoining als Instanzvariablen zu erstellen. Ich weiß, dass primitiver Typ wie int nicht gleich null sein kann, aber was soll ich tun, um zu überprüfen, ob int-Variablen gut gebildet sind oder nicht?

+5

Was würde eine "int" -Variable fehlerhaft machen? –

+1

Dies wären "Geschäftsregeln". Für ein kontextabhängiges Beispiel machen nur positive Alter einen Sinn (und sogar dieser Bereich kann eingeschränkt werden). Es gibt eine ganze Menge Grauzone, wenn/wo Werteinschränkungen erhöht werden sollen. – user2864740

+0

@ElliottFrisch in diesem Zusammenhang vielleicht ein negativer int, eine andere Zahl als int? –

Antwort

0

Das Tutorial, auf das Sie verwiesen haben, ist das Object Ordering Tutorial. Die bestimmte Anweisung bezogen auf the Name class that is given there as an example: Wenn Sie ein solches Name Objekt erstellt, wo das firstName oder das lastName Objekt null war, dann würde die compareTo Methode eine NullPointerException werfen. Dies wird verhindert, indem die Konstruktorargumente sofort überprüft werden.

Allgemein gesagt, sollten Sie sicherstellen, dass die compareTo Methode nicht keine Ausnahme auslösen kann.

Wie Sie bereits bemerkt haben, gibt es keine Möglichkeit, wie eine int Variable in diesem Sinne "missgebildet" werden kann. Es kann nicht null sein, und keine Ausnahme kann verursacht werden, indem ein int Wert mit einem anderen verglichen wird.

Allerdings gibt es einige andere Punkte in der Anleitung aufgeführt sind, und die Sie kümmern sollte:

  • sollten Sie implementieren hashCode
  • Sie implementieren sollten equals
  • sollten Sie sicherstellen, dass Ihre Implementierung von compareTo ist konsistent mit gleich, wie in der Comparable documentation
  • beschrieben, wenn möglich, a ll Ihre Felder final so dass die Klasse ist unveränderlich

Ein Tipp: Sie haben die Integer#compare Methode können int Werte bequem vergleichen.


Eine Randbemerkung: Beachten Sie, dass, obwohl ein int Wert ist immer „gut ausgebildet“ in einem technischen Sinne, es ist sicherlich Geschäft Einschränkungen, die im Konstruktor überprüft werden sollen. In Ihrem Beispiel würden Sie wahrscheinlich zusätzliche Plausibilitätsprüfungen für einige Felder im Konstruktor einfügen wollen:

public Employee(int id, String name, int salary, int age, Date dateOfJoining){ 
    this.id = id; 
    this.name = Objects.requireNonNull(name); 
    if (salary <= 0) { 
     throw new IllegalArgumentException(
      "The salary should be positive, but is "+salary); 
    } 
    this.salary = salary; 
    if (age <= 0) { 
     throw new IllegalArgumentException(
      "The age should be positive, but is "+salary); 
    } 
    this.age = age; 
    this.dateOfJoining = Objects.requireNonNull(dateOfJoining); 
} 
0

Ich fand ähnliche tutorial.

Der Konstruktor überprüft seine Argumente auf Null. Dies stellt sicher, dass alle Name-Objekte wohlgeformt sind, so dass keine der anderen Methoden jemals eine NullPointerException auslösen wird.

Das Name Objekt hat zwei String-Member, sie müssen überprüft werden, ob sie null sind oder nicht. Denn wenn sie null sind lastName.compareTo(n.lastName); wird dieser Teil eine NullPointerException verursachen. Sie müssen für int-Member kein Steuerelement wie dieses erstellen. denn wie du sagst, können int Variablen nicht null sein.