Java Assertions (δήλωση assert)

Σε αυτό το σεμινάριο, θα μάθουμε για τη δήλωση ισχυρισμού Java (ισχυρισμοί Java) με τη βοήθεια παραδειγμάτων.

Οι ισχυρισμοί στην Java βοηθούν στον εντοπισμό σφαλμάτων με τον έλεγχο κώδικα που υποθέτουμε ότι είναι αληθινοί.

Ένας ισχυρισμός γίνεται χρησιμοποιώντας τη assertλέξη-κλειδί.

Η σύνταξή του είναι:

 assert condition;

Εδώ, conditionείναι μια δυαδική έκφραση που υποθέτουμε ότι είναι αληθινή όταν εκτελείται το πρόγραμμα.

Ενεργοποίηση ισχυρισμών

Από προεπιλογή, οι ισχυρισμοί απενεργοποιούνται και αγνοούνται κατά το χρόνο εκτέλεσης.

Για να ενεργοποιήσουμε τους ισχυρισμούς, χρησιμοποιούμε:

 java -ea:arguments

Ή

 java -enableassertions:arguments

Όταν οι ισχυρισμοί είναι ενεργοποιημένοι και η συνθήκη είναι true, το πρόγραμμα εκτελείται κανονικά.

Αλλά αν η συνθήκη αξιολογηθεί έως falseότου είναι ενεργοποιημένοι οι ισχυρισμοί, το JVM ρίχνει ένα AssertionErrorκαι το πρόγραμμα σταματά αμέσως.

Παράδειγμα 1: Ισχυρισμός Java

 class Main ( public static void main(String args()) ( String() weekends = ("Friday", "Saturday", "Sunday"); assert weekends.length == 2; System.out.println("There are " + weekends.length + " weekends in a week"); ) ) 

Παραγωγή

 Υπάρχουν 3 Σαββατοκύριακα σε μια εβδομάδα 

Λαμβάνουμε την παραπάνω έξοδο επειδή αυτό το πρόγραμμα δεν έχει σφάλματα συλλογής και από προεπιλογή, οι ισχυρισμοί είναι απενεργοποιημένοι.

Μετά την ενεργοποίηση των ισχυρισμών, λαμβάνουμε την ακόλουθη έξοδο:

 Εξαίρεση στο νήμα "main" java.lang.AssertionError 

Μια άλλη μορφή δήλωσης ισχυρισμού

 assert condition : expression; 

Σε αυτήν τη μορφή δήλωσης ισχυρισμού, μια έκφραση μεταβιβάζεται στον κατασκευαστή του AssertionErrorαντικειμένου. Αυτή η έκφραση έχει μια τιμή που εμφανίζεται ως το μήνυμα λεπτομερειών του σφάλματος, εάν είναι η συνθήκη false.

Το λεπτομερές μήνυμα χρησιμοποιείται για τη σύλληψη και τη μετάδοση των πληροφοριών σχετικά με την αποτυχία του ισχυρισμού που βοηθά στην αντιμετώπιση του προβλήματος.

Παράδειγμα 2: Ισχυρισμός Java με παράδειγμα έκφρασης

 class Main ( public static void main(String args()) ( String() weekends = ("Friday", "Saturday", "Sunday"); assert weekends.length==2 : "There are only 2 weekends in a week"; System.out.println("There are " + weekends.length + " weekends in a week"); ) ) 

Παραγωγή

 Εξαίρεση στο νήμα "main" java.lang.AssertionError: Υπάρχουν μόνο 2 Σαββατοκύριακα την εβδομάδα 

Όπως βλέπουμε από το παραπάνω παράδειγμα, η έκφραση μεταβιβάζεται στον κατασκευαστή του AssertionErrorαντικειμένου. Εάν η υπόθεσή μας είναι falseκαι οι ισχυρισμοί είναι ενεργοποιημένοι, μια εξαίρεση ρίχνεται με ένα κατάλληλο μήνυμα.

Αυτό το μήνυμα βοηθά στη διάγνωση και τη διόρθωση του σφάλματος που προκάλεσε την αποτυχία του ισχυρισμού.

Ενεργοποίηση ισχυρισμού για συγκεκριμένες κατηγορίες και πακέτα

Εάν δεν παρέχουμε ορίσματα στους διακόπτες γραμμής εντολών ισχυρισμού,

 java -ea 

Αυτό επιτρέπει ισχυρισμούς σε όλες τις κατηγορίες εκτός από τις κλάσεις συστήματος

Μπορούμε επίσης να ενεργοποιήσουμε τον ισχυρισμό για συγκεκριμένες τάξεις και πακέτα χρησιμοποιώντας ορίσματα. Τα ορίσματα που μπορούν να παρασχεθούν σε αυτούς τους διακόπτες γραμμής εντολών είναι:

Ενεργοποίηση ισχυρισμού σε ονόματα τάξεων

Για να ενεργοποιήσετε τον ισχυρισμό για όλες τις τάξεις του προγράμματος μας Main,

 java -ea Main

Για να ενεργοποιήσετε μόνο μία τάξη,

 java -ea:AnimalClass Main

Αυτό επιτρέπει τον ισχυρισμό μόνο AnimalClassστο Mainπρόγραμμα.

Ενεργοποιήστε τον ισχυρισμό σε ονόματα πακέτων

Για να ενεργοποιήσετε ισχυρισμούς για πακέτο com.animalκαι μόνο τα υπο-πακέτα,

 java -ea:com.animal… Main

Ενεργοποιήστε τον ισχυρισμό σε πακέτα χωρίς όνομα

Για να ενεργοποιήσετε τον ισχυρισμό σε πακέτα χωρίς όνομα (όταν δεν χρησιμοποιούμε δήλωση πακέτου) στον τρέχοντα κατάλογο εργασίας.

 java -ea:… Main

Ενεργοποίηση του ισχυρισμού σε κλάσεις συστήματος

Για να ενεργοποιήσουμε τον ισχυρισμό σε κλάσεις συστήματος, χρησιμοποιούμε έναν διαφορετικό διακόπτη γραμμής εντολών:

 java -esa:arguments 

Ή

 java -enablesystemassertions:arguments

Τα επιχειρήματα που μπορούν να παρασχεθούν σε αυτούς τους διακόπτες είναι τα ίδια.

Απενεργοποίηση ισχυρισμών

Για να απενεργοποιήσουμε τους ισχυρισμούς, χρησιμοποιούμε:

 java -da arguments 

Ή

 java -disableassertions arguments 

To disable assertion in system classes, we use:

 java -dsa:arguments

OR

 java -disablesystemassertions:arguments

The arguments that can be passed while disabling assertions are the same as while enabling them.

Advantages of Assertion

  1. Quick and efficient for detecting and correcting bugs.
  2. Assertion checks are done only during development and testing. They are automatically removed in the production code at runtime so that it won’t slow the execution of the program.
  3. It helps remove boilerplate code and make code more readable.
  4. Refactors and optimizes code with increased confidence that it functions correctly.

When to use Assertions

1. Unreachable codes

Unreachable codes are codes that do not execute when we try to run the program. Use assertions to make sure unreachable codes are actually unreachable.

Let’s take an example.

 void unreachableCodeMethod() ( System.out.println("Reachable code"); return; // Unreachable code System.out.println("Unreachable code"); assert false; ) 

Let’s take another example of a switch statement without a default case.

 switch (dayOfWeek) ( case "Sunday": System.out.println("It’s Sunday!"); break; case "Monday": System.out.println("It’s Monday!"); break; case "Tuesday": System.out.println("It’s Tuesday!"); break; case "Wednesday": System.out.println("It’s Wednesday!"); break; case "Thursday": System.out.println("It’s Thursday!"); break; case "Friday": System.out.println("It’s Friday!"); break; case "Saturday": System.out.println("It’s Saturday!"); break; ) 

The above switch statement indicates that the days of the week can be only one of the above 7 values. Having no default case means that the programmer believes that one of these cases will always be executed.

However, there might be some cases that have not yet been considered where the assumption is actually false.

This assumption should be checked using an assertion to make sure that the default switch case is not reached.

 default: assert false: dayofWeek + " is invalid day"; 

If dayOfWeek has a value other than the valid days, an AssertionError is thrown.

2. Documenting assumptions

To document their underlying assumptions, many programmers use comments. Let’s take an example.

 if (i % 2 == 0) (… ) else ( // We know (i % 2 == 1)… ) 

Use assertions instead.

Comments can get out-of-date and out-of-sync as the program grows. However, we will be forced to update the assert statements; otherwise, they might fail for valid conditions too.

 if (i % 2 == 0) (… ) else ( assert i % 2 == 1 : i;… ) 

When not to use Assertions

1. Argument checking in public methods

Arguments in public methods may be provided by the user.

So, if an assertion is used to check these arguments, the conditions may fail and result in AssertionError.

Instead of using assertions, let it result in the appropriate runtime exceptions and handle these exceptions.

2. To evaluate expressions that affect the program operation

Do not call methods or evaluate exceptions that can later affect the program operation in assertion conditions.

Let us take an example of a list weekdays which contains the names of all the days in a week.

  ArrayList weekdays = new ArrayList(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" )); ArrayList weekends= new ArrayList(Arrays.asList("Sunday", "Saturday" )); assert weekdays.removeAll(weekends); 

Here, we are trying to remove elements Saturday and Sunday from the ArrayList weekdays.

Εάν ο ισχυρισμός είναι ενεργοποιημένος, το πρόγραμμα λειτουργεί καλά. Ωστόσο, εάν οι ισχυρισμοί είναι απενεργοποιημένοι, τα στοιχεία από τη λίστα δεν καταργούνται. Αυτό μπορεί να οδηγήσει σε αποτυχία του προγράμματος.

Αντ 'αυτού, αντιστοιχίστε το αποτέλεσμα σε μια μεταβλητή και, στη συνέχεια, χρησιμοποιήστε αυτήν τη μεταβλητή για επιβεβαίωση.

 ArrayList weekdays = new ArrayList(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" )); ArrayList weekends= new ArrayList(Arrays.asList("Sunday", "Saturday" )); boolean weekendsRemoved = weekdays.removeAll(weekends); assert weekendsRemoved; 

Με αυτόν τον τρόπο, μπορούμε να διασφαλίσουμε ότι όλα τα σαββατοκύριακα καταργούνται από τις καθημερινές ανεξάρτητα από τον ισχυρισμό ότι είναι ενεργοποιημένος ή απενεργοποιημένος. Ως αποτέλεσμα, δεν επηρεάζει τη λειτουργία του προγράμματος στο μέλλον.

ενδιαφέροντα άρθρα...