Summary
Mark java.net.InetAddress
as a sealed class. Make java.net.Inet4Address
and java.net.Inet6Address
as the only permitted subclasses.
Problem
java.net.InetAddress
is a public non-final class that only has package-private constructors. The only two sub-classes are the Inet4Address
and the Inet6Address
, both of which have only package-private constructors, and are final. Effectively, these are the only sub-classes of the java.net.InetAddress
within the JDK. No other sub-classes are intended for the InetAddress
.
Therefore, marking it sealed allows the JDK code to take advantage of the compiler checks that will prevent any unexpected sub-classes to be introduced.
Solution
Mark the InetAddress
class as sealed and permit only Inet4Address
and Inet6Address
classes to extended it. Both the Inet4Address
and Inet6Address
are final classes already.
Specification
--- a/src/java.base/share/classes/java/net/InetAddress.java
+++ b/src/java.base/share/classes/java/net/InetAddress.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2021, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2022, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -223,7 +223,7 @@ import static java.net.spi.InetAddressResolver.LookupPolicy.IPV6_FIRST;
* @see java.net.InetAddress#getLocalHost()
* @since 1.0
*/
-public class InetAddress implements java.io.Serializable {
+public sealed class InetAddress implements java.io.Serializable permits Inet4Address, Inet6Address {
- csr of
-
JDK-8282536 java.net.InetAddress should be a sealed class
-
- Resolved
-