Τύποι σχολιασμών Java

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

Οι σχολιασμοί Java είναι μεταδεδομένα (δεδομένα σχετικά με τα δεδομένα) για τον πηγαίο κώδικα του προγράμματος. Υπάρχουν αρκετοί προκαθορισμένοι σχολιασμοί που παρέχονται από το Java SE. Επιπλέον, μπορούμε επίσης να δημιουργήσουμε προσαρμοσμένους σχολιασμούς σύμφωνα με τις ανάγκες μας.

Εάν δεν ξέρετε τι είναι οι σχολιασμοί, επισκεφτείτε τον οδηγό σχολιασμών Java.

Αυτοί οι σχολιασμοί μπορούν να κατηγοριοποιηθούν ως:

1. Προκαθορισμένοι σχολιασμοί

  • @Deprecated
  • @Override
  • @SuppressWarnings
  • @SafeVarargs
  • @FunctionalInterface

2. Προσαρμοσμένοι σχολιασμοί

3. Μετα-σχολιασμοί

  • @Retention
  • @Documented
  • @Target
  • @Inherited
  • @Repeatable

Προκαθορισμένοι τύποι σχολιασμών

1. @ Κατάργηση

Ο @Deprecatedσχολιασμός είναι ένας σχολιασμός δείκτη που δείχνει ότι το στοιχείο (κλάση, μέθοδος, πεδίο κ.λπ.) έχει καταργηθεί και έχει αντικατασταθεί από ένα νεότερο στοιχείο.

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

 @Deprecated accessModifier returnType deprecatedMethodName() (… ) 

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

Χρησιμοποιούμε την @deprecatedετικέτα Javadoc για την τεκμηρίωση του καταργημένου στοιχείου.

 /** * @deprecated * why it was deprecated */ @Deprecated accessModifier returnType deprecatedMethodName() (… ) 

Παράδειγμα 1: Παράδειγμα σχολιασμού που έχει καταργηθεί

 class Main ( /** * @deprecated * This method is deprecated and has been replaced by newMethod() */ @Deprecated public static void deprecatedMethod() ( System.out.println("Deprecated method"); ) public static void main(String args()) ( deprecatedMethod(); ) ) 

Παραγωγή

 Καταργημένη μέθοδος 

2. @ Override

Ο @Overrideσχολιασμός καθορίζει ότι μια μέθοδος μιας υποκατηγορίας παρακάμπτει τη μέθοδο του superclass με το ίδιο όνομα μεθόδου, τύπο επιστροφής και λίστα παραμέτρων.

Δεν είναι υποχρεωτικό να χρησιμοποιείται @Overrideκατά την παράκαμψη μιας μεθόδου. Ωστόσο, εάν το χρησιμοποιούμε, ο μεταγλωττιστής δίνει ένα σφάλμα εάν κάτι δεν πάει καλά (όπως λάθος τύπος παραμέτρου) κατά την παράκαμψη της μεθόδου.

Παράδειγμα 2: Παράδειγμα σχολιασμού @Override

 class Animal ( // overridden method public void display()( System.out.println("I am an animal"); ) ) class Dog extends Animal ( // overriding method @Override public void display()( System.out.println("I am a dog"); ) public void printMessage()( display(); ) ) class Main ( public static void main(String() args) ( Dog dog1 = new Dog(); dog1.printMessage(); ) ) 

Παραγωγή

 είμαι σκύλος 

Σε αυτό το παράδειγμα, κάνοντας ένα αντικείμενο dog1 της κλάσης Dog, μπορούμε να καλέσουμε τη μέθοδο printMessage () που στη συνέχεια εκτελεί τη display()δήλωση.

Δεδομένου ότι display()ορίζεται και στις δύο κατηγορίες, η μέθοδος της υποκατηγορίας Dog αντικαθιστά τη μέθοδο του superclass Animal. Ως εκ τούτου, display()καλείται η υποκατηγορία.

3. @SuppressWarnings

Όπως υποδηλώνει το όνομα, ο @SuppressWarningsσχολιασμός δίνει εντολή στον μεταγλωττιστή να καταργήσει τις προειδοποιήσεις που δημιουργούνται κατά την εκτέλεση του προγράμματος.

Μπορούμε να καθορίσουμε τον τύπο των προειδοποιήσεων που θα καταργηθούν. Οι προειδοποιήσεις που μπορούν να καταργηθούν είναι ειδικά για τον μεταγλωττιστή, αλλά υπάρχουν δύο κατηγορίες προειδοποιήσεων: κατάργηση και μη επιλεγμένη .

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

 @SuppressWarnings("warningCategory") 

Για παράδειγμα,

 @SuppressWarnings("deprecated") 

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

 @SuppressWarnings(("warningCategory1", "warningCategory2")) 

Για παράδειγμα,

 @SuppressWarnings(("deprecated", "unchecked")) 

Η Κατηγορία deprecatedδίνει εντολή στον μεταγλωττιστή να καταργήσει τις προειδοποιήσεις όταν χρησιμοποιούμε ένα στοιχείο που έχει καταργηθεί.

Η Κατηγορία uncheckedδίνει εντολή στον μεταγλωττιστή να καταργήσει τις προειδοποιήσεις όταν χρησιμοποιούμε ακατέργαστους τύπους.

Και, οι απροσδιόριστες προειδοποιήσεις αγνοούνται. Για παράδειγμα,

 @SuppressWarnings("someundefinedwarning") 

Παράδειγμα 3: Παράδειγμα σχολιασμού @SuppressWarnings

 class Main ( @Deprecated public static void deprecatedMethod() ( System.out.println("Deprecated method"); ) @SuppressWarnings("deprecated") public static void main(String args()) ( Main depObj = new Main(); depObj. deprecatedMethod(); ) ) 

Παραγωγή

 Καταργημένη μέθοδος 

Εδώ, deprecatedMethod()έχει επισημανθεί ως καταργημένο και θα δώσει προειδοποιήσεις μεταγλωττιστή όταν χρησιμοποιείται. Χρησιμοποιώντας τον @SuppressWarnings("deprecated")σχολιασμό, μπορούμε να αποφύγουμε τις προειδοποιήσεις του μεταγλωττιστή.

4. @SafeVarargs

The @SafeVarargs annotation asserts that the annotated method or constructor does not perform unsafe operations on its varargs (variable number of arguments).

We can only use this annotation on methods or constructors that cannot be overridden. This is because the methods that override them might perform unsafe operations.

Before Java 9, we could use this annotation only on final or static methods because they cannot be overridden. We can now use this annotation for private methods as well.

Example 4: @SafeVarargs annotation example

 import java.util.*; class Main ( private void displayList(List… lists) ( for (List list : lists) ( System.out.println(list); ) ) public static void main(String args()) ( Main obj = new Main(); List universityList = Arrays.asList("Tribhuvan University", "Kathmandu University"); obj.displayList(universityList); List programmingLanguages = Arrays.asList("Java", "C"); obj.displayList(universityList, programmingLanguages); ) ) 

Warnings

 Type safety: Potential heap pollution via varargs parameter lists Type safety: A generic array of List is created for a varargs parameter 

Output

 Note: Main.java uses unchecked or unsafe operations. (Tribhuvan University, Kathmandu University) (Tribhuvan University, Kathmandu University) (Java, C) 

Here, List … lists specifies a variable-length argument of type List. This means that the method displayList() can have zero or more arguments.

The above program compiles without errors but gives warnings when @SafeVarargs annotation isn't used.

When we use @SafeVarargs annotation in the above example,

 @SafeVarargs private void displayList(List… lists) (… ) 

We get the same output but without any warnings. Unchecked warnings are also suppressed when we use this annotation.

5. @FunctionalInterface

Java 8 first introduced this @FunctionalInterface annotation. This annotation indicates that the type declaration on which it is used is a functional interface. A functional interface can have only one abstract method.

Example 5: @FunctionalInterface annotation example

 @FunctionalInterface public interface MyFuncInterface( public void firstMethod(); // this is an abstract method ) 

If we add another abstract method, let's say

 @FunctionalInterface public interface MyFuncInterface( public void firstMethod(); // this is an abstract method public void secondMethod(); // this throws compile error ) 

Now, when we run the program, we will get the following warning:

 Unexpected @FunctionalInterface annotation @FunctionalInterface MyFuncInterface is not a functional interface multiple non-overriding abstract methods found in interface MyFuncInterface 

It is not mandatory to use @FunctionalInterface annotation. The compiler will consider any interface that meets the functional interface definition as a functional interface.

We use this annotation to make sure that the functional interface has only one abstract method.

However, it can have any number of default and static methods because they have an implementation.

 @FunctionalInterface public interface MyFuncInterface( public void firstMethod(); // this is an abstract method default void secondMethod() (… ) default void thirdMethod() (… ) ) 

Custom Annotations

It is also possible to create our own custom annotations.

Its syntax is:

 (Access Specifier) @interface ( DataType () (default value); ) 

Here is what you need to know about custom annotation:

  • Annotations can be created by using @interface followed by the annotation name.
  • The annotation can have elements that look like methods but they do not have an implementation.
  • The default value is optional. The parameters cannot have a null value.
  • The return type of the method can be primitive, enum, string, class name or array of these types.

Example 6: Custom annotation example

 @interface MyCustomAnnotation ( String value() default "default value"; ) class Main ( @MyCustomAnnotation(value = "programiz") public void method1() ( System.out.println("Test method 1"); ) public static void main(String() args) throws Exception ( Main obj = new Main(); obj.method1(); ) ) 

Output

 Test method 1 

Meta Annotations

Meta-annotations are annotations that are applied to other annotations.

1. @Retention

The @Retention annotation specifies the level up to which the annotation will be available.

Its syntax is:

 @Retention(RetentionPolicy) 

There are 3 types of retention policies:

  • RetentionPolicy.SOURCE - The annotation is available only at the source level and is ignored by the compiler.
  • RetentionPolicy.CLASS - The annotation is available to the compiler at compile-time, but is ignored by the Java Virtual Machine (JVM).
  • RetentionPolicy.RUNTIME - The annotation is available to the JVM.

For example,

 @Retention(RetentionPolicy.RUNTIME) public @interface MyCustomAnnotation(… ) 

2. @Documented

By default, custom annotations are not included in the official Java documentation. To include our annotation in the Javadoc documentation, we use the @Documented annotation.

For example,

 @Documented public @interface MyCustomAnnotation(… ) 

3. @Target

We can restrict an annotation to be applied to specific targets using the @Target annotation.

Its syntax is:

 @Target(ElementType) 

The ElementType can have one of the following types:

Element Type Target
ElementType.ANNOTATION_TYPE Annotation type
ElementType.CONSTRUCTOR Constructors
ElementType.FIELD Fields
ElementType.LOCAL_VARIABLE Local variables
ElementType.METHOD Methods
ElementType.PACKAGE Package
ElementType.PARAMETER Parameter
ElementType.TYPE Any element of class

For example,

 @Target(ElementType.METHOD) public @interface MyCustomAnnotation(… ) 

In this example, we have restricted the use of this annotation to methods only.

Note: If the target type is not defined, the annotation can be used for any element.

4. @Inherited

By default, an annotation type cannot be inherited from a superclass. However, if we need to inherit an annotation from a superclass to a subclass, we use the @Inherited annotation.

Its syntax is:

 @Inherited 

For example,

 @Inherited public @interface MyCustomAnnotation (… ) @MyCustomAnnotation public class ParentClass(… ) public class ChildClass extends ParentClass (… ) 

5. @Repeatable

An annotation that has been marked by @Repeatable can be applied multiple times to the same declaration.

 @Repeatable(Universities.class) public @interface University ( String name(); ) 

Η τιμή που ορίζεται στον @Repeatableσχολιασμό είναι ο σχολιασμός κοντέινερ. Ο σχολιασμός κοντέινερ έχει μια μεταβλητή τιμή του τύπου πίνακα του παραπάνω επαναλαμβανόμενου σχολιασμού. Εδώ Universitiesείναι ο τύπος σχολιασμού που περιέχει.

 public @interface Universities ( University() value(); ) 

Τώρα, ο @Universityσχολιασμός μπορεί να χρησιμοποιηθεί πολλές φορές στην ίδια δήλωση.

 @University(name = "TU") @University(name = "KU") private String uniName; 

Εάν χρειαστεί να ανακτήσουμε τα δεδομένα σχολιασμού, μπορούμε να χρησιμοποιήσουμε το Reflection API.

Για να ανακτήσουμε τιμές σχολιασμού, χρησιμοποιούμε getAnnotationsByType()ή getAnnotations()μέθοδο που ορίζεται στο Reflection API.

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