国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Home Java javaTutorial Sealed Classes en Java

Sealed Classes en Java

Oct 29, 2024 am 01:37 AM

Sealed Classes en Java

sealed classes are a feature that was previously introduced in JDK 15 and formally in JDK 17. A sealed class is a class that cannot be extended by classes that are not explicitly allowed (in the class declaration), so the number of subclasses is limited and known in advance.

They are intended to allow more precise control over the inheritance hierarchy, as well as facilitate the modeling of domains where all possible subclasses are known, and improve the security and maintainability of the code.

The difference between a sealed class and a class of the final type is that the latter cannot be extended by any class, while a sealed class can be extended by a limited number of classes.

Declaration of a sealed class

Suppose we have two classes, a Shape class and a Circle class, both are normal classes, so Shape can be extended by any class.

public class Shape {
    // ...
}

public class Circle extends Shape {
    // ...
}

If we use the final keyword in the Shape class, then it cannot be extended by any class.

public final class Shape {
    // ...
}

public class Circle extends Shape { // Error
    // ...
}

Now, if we want the Shape class to be extended only by certain classes (for example, Circle and Square), then we can declare it as a sealed class.

public sealed class Shape permits Circle, Square {
    // ...
}

Analyzing the previous declaration, we see that it is necessary to place sealed before the word class to indicate that it is a sealed class. Then, the word permits is used followed by a list of classes that can extend the current class, in the example above, only the Circle and Square classes can extend the Shape class.

The same thing happens if you work with a class of the abstract type, that is, a class that cannot be instantiated, but that can be extended by other classes.

public sealed abstract class Shape permits Circle, Square {
    // ...
}

This concept can also be applied to interfaces.

public sealed interface Shape permits Circle, Square {
    // ...
}

Note: Allowed subclasses must be within the same module or package as the sealed class, otherwise an error message will be displayed.

Allowed classes

Once a class has been declared sealed and the allowed classes have been specified, when extending the Shape class with an allowed class (by placing extends Shape) the IDE will display an error message similar to this Modifier 'sealed', 'non-sealed' or 'final' expected, What does this mean?.

It must be taken into consideration that each of the allowed classes (subclasses) must be declared with one of the following keywords:

  • final: Indicates that the class cannot be extended.
  • sealed: Indicates that the class is a sealed class and that it has allowed subclasses.
  • non-sealed: Indicates that the class is not a sealed class and that it can be extended by any class.

To put the above into practice, let's work with the Shape class and the Circle, Square and Triangle classes to see how the allowed classes can be declared according to what was mentioned above.

public class Shape {
    // ...
}

public class Circle extends Shape {
    // ...
}

Circle class - final

If we want the Circle class to be of the final type and consequently cannot be extended, then it must be declared as follows:

public final class Shape {
    // ...
}

public class Circle extends Shape { // Error
    // ...
}

This prevents the Circle class from being extended by any other class.

Square class - sealed

If we want the Square class to be of type sealed and have allowed subclasses that can extend it, then it must be declared as follows:

public sealed class Shape permits Circle, Square {
    // ...
}

For this example, each of the allowed classes (SquareChild1 and SquareChild2) are declared of type final so that they cannot be extended by any other class.

public sealed abstract class Shape permits Circle, Square {
    // ...
}

If you want these classes to be able to be extended by more classes, then they should be declared as sealed or that they can be extended by any class with non-sealed.

Triangle class - non-sealed

In the case of the Triangle class, when it is declared non-sealed, it allows this class to be extended by any other class, without the need to specify the allowed classes.

public sealed interface Shape permits Circle, Square {
    // ...
}

For example, if you create the TriangleChild class that extends Triangle, no error message will be displayed.

public sealed class Shape permits Circle, Square, Triangle {
    // ...
}

At this point it is important to consider that if you declare a class as non-sealed you "break" in a certain way the purpose of the sealed classes, since it allows this class be extended by any other class and the number of allowed subclasses is not limited.

Can a record be a sealed class?

For its part, a record cannot be of the sealed type since it is already of the final type and cannot be extended by any other class. But what you can do is declare a record as allowed in a interface of the sealed type (consider that a record cannot extend a class, only implement interfaces). For example, if you have a record called Rectangle and a Shape interface of type sealed, you can declare Rectangle as allowed in the Shape interface and in this way Rectangle will be able to implement the Shape interface and all the methods that this interface contains.

public class Shape {
    // ...
}

public class Circle extends Shape {
    // ...
}

What about inner classes?

If a class declared as sealed has inner classes (nested or inner classes), it is assumed that these classes belong to the main class and, therefore, it is not necessary to declare them as allowed. For example, if you have the class Animal declared as sealed and at the same time it has Dog and Cat as internal classes, these classes do not need to be declared as allowed, but they must extend the main class and be of the final type, sealed or non-sealed. .

public final class Shape {
    // ...
}

public class Circle extends Shape { // Error
    // ...
}

Conclusions

The sealed classes are a way of limiting a class hierarchy to a finite number of allowed subclasses, although we have seen that if a class is declared non-sealed the purpose is somewhat lost or By declaring a subclass as sealed you can extend this hierarchy even further.

It is important to consider that when declaring a class as sealed this only refers to who can extend it, but does not limit the creation of instances of the main class, nor does it modify the semantics of the class, that is, it is not modifies the internal behavior of the class.

The above is the detailed content of Sealed Classes en Java. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undress AI Tool

Undress AI Tool

Undress images for free

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Difference between HashMap and Hashtable? Difference between HashMap and Hashtable? Jun 24, 2025 pm 09:41 PM

The difference between HashMap and Hashtable is mainly reflected in thread safety, null value support and performance. 1. In terms of thread safety, Hashtable is thread-safe, and its methods are mostly synchronous methods, while HashMap does not perform synchronization processing, which is not thread-safe; 2. In terms of null value support, HashMap allows one null key and multiple null values, while Hashtable does not allow null keys or values, otherwise a NullPointerException will be thrown; 3. In terms of performance, HashMap is more efficient because there is no synchronization mechanism, and Hashtable has a low locking performance for each operation. It is recommended to use ConcurrentHashMap instead.

Why do we need wrapper classes? Why do we need wrapper classes? Jun 28, 2025 am 01:01 AM

Java uses wrapper classes because basic data types cannot directly participate in object-oriented operations, and object forms are often required in actual needs; 1. Collection classes can only store objects, such as Lists use automatic boxing to store numerical values; 2. Generics do not support basic types, and packaging classes must be used as type parameters; 3. Packaging classes can represent null values ??to distinguish unset or missing data; 4. Packaging classes provide practical methods such as string conversion to facilitate data parsing and processing, so in scenarios where these characteristics are needed, packaging classes are indispensable.

What are static methods in interfaces? What are static methods in interfaces? Jun 24, 2025 pm 10:57 PM

StaticmethodsininterfaceswereintroducedinJava8toallowutilityfunctionswithintheinterfaceitself.BeforeJava8,suchfunctionsrequiredseparatehelperclasses,leadingtodisorganizedcode.Now,staticmethodsprovidethreekeybenefits:1)theyenableutilitymethodsdirectly

How does JIT compiler optimize code? How does JIT compiler optimize code? Jun 24, 2025 pm 10:45 PM

The JIT compiler optimizes code through four methods: method inline, hot spot detection and compilation, type speculation and devirtualization, and redundant operation elimination. 1. Method inline reduces call overhead and inserts frequently called small methods directly into the call; 2. Hot spot detection and high-frequency code execution and centrally optimize it to save resources; 3. Type speculation collects runtime type information to achieve devirtualization calls, improving efficiency; 4. Redundant operations eliminate useless calculations and inspections based on operational data deletion, enhancing performance.

What is an instance initializer block? What is an instance initializer block? Jun 25, 2025 pm 12:21 PM

Instance initialization blocks are used in Java to run initialization logic when creating objects, which are executed before the constructor. It is suitable for scenarios where multiple constructors share initialization code, complex field initialization, or anonymous class initialization scenarios. Unlike static initialization blocks, it is executed every time it is instantiated, while static initialization blocks only run once when the class is loaded.

What is the Factory pattern? What is the Factory pattern? Jun 24, 2025 pm 11:29 PM

Factory mode is used to encapsulate object creation logic, making the code more flexible, easy to maintain, and loosely coupled. The core answer is: by centrally managing object creation logic, hiding implementation details, and supporting the creation of multiple related objects. The specific description is as follows: the factory mode handes object creation to a special factory class or method for processing, avoiding the use of newClass() directly; it is suitable for scenarios where multiple types of related objects are created, creation logic may change, and implementation details need to be hidden; for example, in the payment processor, Stripe, PayPal and other instances are created through factories; its implementation includes the object returned by the factory class based on input parameters, and all objects realize a common interface; common variants include simple factories, factory methods and abstract factories, which are suitable for different complexities.

What is the `final` keyword for variables? What is the `final` keyword for variables? Jun 24, 2025 pm 07:29 PM

InJava,thefinalkeywordpreventsavariable’svaluefrombeingchangedafterassignment,butitsbehaviordiffersforprimitivesandobjectreferences.Forprimitivevariables,finalmakesthevalueconstant,asinfinalintMAX_SPEED=100;wherereassignmentcausesanerror.Forobjectref

What is type casting? What is type casting? Jun 24, 2025 pm 11:09 PM

There are two types of conversion: implicit and explicit. 1. Implicit conversion occurs automatically, such as converting int to double; 2. Explicit conversion requires manual operation, such as using (int)myDouble. A case where type conversion is required includes processing user input, mathematical operations, or passing different types of values ??between functions. Issues that need to be noted are: turning floating-point numbers into integers will truncate the fractional part, turning large types into small types may lead to data loss, and some languages ??do not allow direct conversion of specific types. A proper understanding of language conversion rules helps avoid errors.

See all articles