热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Java9中SafeVarargs注释的使用与示例解析

@ Java 9 中的 SafeVarargs 注释,示例原文:https://www . geesforgeks . org/

@ Java 9 中的 SafeVarargs 注释,示例

原文:https://www . geesforgeks . org/safevarags-annotation-in-Java-9-with-example/

@SafeVarargs 注释 : @SafeVarargs 注释引入 JDK 7。@SafeVarargs 注释用于在编译时抑制不安全的操作警告。每当我们在代码中调用具有可变参数的方法时,不安全操作警告就会在编译时出现。@SafeVarargs 注释可以与方法/构造函数一起使用,并且方法应该是最终的或静态的。我们可以对不能被重写的方法使用@SafeVarargs 注释,因为重写方法仍然可以对它们的 Varargs 执行不安全的操作。@ SafeVarargs 注释用于指示方法不会导致堆污染。这些方法被认为是安全的。

在 JDK 9 中,JDK 开发人员扩展了@ safevarags 注释的使用,现在除了 final 或 static 方法之外,我们还可以在 private 方法中使用@ safevarags 注释。这是因为不能重写私有方法。

什么是不安全操作警告?

Java 5 引入了 Varargs 的概念,或者说是一个可变长度的方法参数,以及 Generics ,这次只增加了未检查或者不安全操作的警告。现在的问题是,为什么当我们将方法与 varargs 一起使用或使用泛型时,编译器会抛出警告?当编译器抛出不安全操作警告时,编译器通常会以某种方式要求您更明确地说明类型。

我们用一些例子来理解这个概念:

// Program to illustrate the unsafe operation warnings
// message with respect to varargs parameter
import java.util.ArrayList;
import java.util.List;
public class Geeksforgeeks {
    // print is a method with variable argument
    private void print(List... topics)
    {
        for (List<String> topic : topics) {
            System.out.println(topic);
        }
    }
    public static void main(String[] args)
    {
        Geeksforgeeks obj = new Geeksforgeeks();
        List<String> list = new ArrayList<String>();
        list.add("OOPS");
        list.add("COLLECTION");
        obj.print(list);
    }
}

编译时控制台:

Note: Geeksforgeeks.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

输出:

[OOPS, COLLECTION]

这里我们有一个方法,它的 varargs 类型为 List。但是这里我们没有提到 List 将存储的数据类型。这里编译器会警告你,我不会检查你的代码。我不会检查您将添加到数组列表中的值是否属于任何特定类型。这就是为什么它会在编译时抛出不安全的操作警告。这里编译器想知道类型

List<String> geeks = new ArrayList<String>();

如果我们用类型创建数组列表,那么编译器在编译时不会抛出任何警告消息。

让我们在使用@SafeVarargs 注释后再次运行相同的代码。

// Program to illustrate the
// @SafeVarargs with respect to varargs
import java.util.ArrayList;
import java.util.List;
public class Geeksforgeeks {
    // Here we used @SafeVarargs annotation,
    // now we will not get any unchecked
    // or unsafe operations warning message
    // at compile time
    @SafeVarargs
    private void print(List... topics)
    {
        for (List<String> topic : topics) {
            System.out.println(topic);
        }
    }
    public static void main(String[] args)
    {
        Geeksforgeeks obj = new Geeksforgeeks();
        List<String> list = new ArrayList<String>();
        list.add("OOPS");
        list.add("COLLECTION");
        obj.print(list);
    }
}

输出:

[OOPS, COLLECTION]

注意:假设如果你想在 JDK 7 或 JDK 8 中运行上述代码,那么你会得到一个编译错误,因为这些增强是在 java 9 之前的 Java 9 中完成的——私有方法不允许用这个注释来标记。

// Program to illustrate the unsafe
// operation warnings message
// with respect to Generics
import java.util.ArrayList;
import java.util.List;
public class Geeks<T> {
    private List<T> topics = new ArrayList<>();
    // Here add() is a method with varargs of type T
    // Here T is unknown for
    // the compiler at the compile time
    // That's why It will throw unsafe
    // operation warning message
    public final void add(T... toAdd)
    {
        for (T topic : toAdd) {
            topics.add(topic);
        }
    }
    public static void main(String[] args)
    {
        Geeks geek = new Geeks();
        geek.add("OOPS",
                 "COLLECTIONS",
                 "EXCEPTION-HANDLING");
        System.out.println(geek.topics);
    }
}

编译时控制台:

Note: Geeks.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

输出:

[OOPS, COLLECTIONS, EXCEPTION-HANDLING]

让我们在使用@SafeVarargs 注释后再次运行相同的代码。

// Program to illustrate the
// @SafeVarargs with respect to Generics
import java.util.ArrayList;
import java.util.List;
public class Geeks<T> {
    private List<T> topics = new ArrayList<>();
    // Here by placing @SafeVarargs annotation
    // to add() method, we are ensuring to the
    // compiler that our action is safe.
    // That's why compiler will not throw
    // any warning message at the compile time.
    @SafeVarargs
    public final void add(T... toAdd)
    {
        for (T topic : toAdd) {
            topics.add(topic);
        }
    }
    public static void main(String[] args)
    {
        Geeks geek = new Geeks();
        geek.add("OOPS",
                 "COLLECTIONS",
                 "EXCEPTION-HANDLING");
        System.out.println(geek.topics);
    }
}

输出:

[OOPS, COLLECTIONS, EXCEPTION-HANDLING]


推荐阅读
  • 在现代多线程编程中,Lock接口提供的灵活性和控制力超越了传统的synchronized关键字。Lock接口不仅使锁成为一个独立的对象,还提供了更细粒度的锁定机制,例如读写锁(ReadWriteLock)。本文将探讨如何利用ReentrantReadWriteLock提高并发性能。 ... [详细]
  • 本文深入探讨了Java注解的基本概念及其在现代Java开发中的应用。文章不仅介绍了如何创建和使用自定义注解,还详细讲解了如何利用反射机制解析注解,以及Java内建注解的使用场景。 ... [详细]
  • 本文详细介绍了 C# 编程语言中 Main 方法的作用、不同形式及其使用场景,帮助开发者更好地理解和应用这一重要概念。 ... [详细]
  • 一个产品数组拼图|集合 2 (O(1)空间) ... [详细]
  • 本文章介绍了如何将阿拉伯数字形式的金额转换为中国传统的大写形式,适用于财务报告和正式文件中的金额表示。 ... [详细]
  • 近期参加了一次CSDN线上活动,有幸获得左飞老师的《算法之美——隐匿在数据结构背后的原理(C++版)》一书。为了加深理解并提升编程技能,我决定将书中22个经典算法问题使用Java语言进行重新编写。本文将重点介绍如何使用Java实现Z字形矩阵排列。 ... [详细]
  • 本文探讨了在Java应用中实现线程池优雅关闭的两种方法,包括使用ShutdownHook注册钩子函数以及通过SignalHandler处理信号量。每种方法都提供了具体的代码示例,并讨论了可能遇到的问题及解决方案。 ... [详细]
  • 快速排序是一种高效的排序算法,以其在多数情况下接近最优的性能而著称。本文将详细介绍如何在 Java 中实现快速排序,并分析其工作原理。 ... [详细]
  • 本文介绍了一种利用迭代法解决特定方程问题的方法,特别是当给定函数f(x)在区间[x1, x2]内连续且f(x1)0时,存在一个x~使得f(x~)=0。通过逐步细化搜索范围,可以高效地找到方程的根。 ... [详细]
  • 快速排序是基于分治策略的一种排序算法,其平均时间复杂度为O(n log n),在大多数情况下表现优于其他排序算法。本文将详细介绍快速排序的工作原理,并提供一个Java语言的具体实现。 ... [详细]
  • 设计模式笔记12:迭代器模式(Iterator Pattern) ... [详细]
  • Shiro功能拓展:登录失败重试次数限制
    本文详细介绍了如何在Apache Shiro框架中实现对用户登录失败重试次数的限制,通过自定义密码匹配器来增强系统的安全性。该方法不仅能够有效防止暴力破解攻击,还能确保合法用户的账户安全。 ... [详细]
  • 导读上一篇讲了zsh的常用字符串操作,这篇开始讲更为琐碎的转义字符和格式化输出相关内容。包括转义字符、引号、print、printf的使用等等。其中很多内容没有必要记忆,作为手册参 ... [详细]
  • 本文深入探讨了Redis的快照持久化机制,包括其工作原理、配置方法以及如何手动触发快照。通过这种方式,Redis能够确保在服务器重启后数据的安全性和完整性。 ... [详细]
  • 本文档详细介绍了服务器与应用系统迁移的策略与实施步骤。迁移不仅涉及数据的转移,还包括环境配置、应用兼容性测试等多个方面,旨在确保迁移过程的顺利进行及迁移后的系统稳定运行。 ... [详细]
author-avatar
zpy7005434
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有