Effective Java笔记(27)消除非受检的警告

news2024/12/22 22:27:56

        用泛型编程时会遇到讲多编译器警告 : 非受检转换警告( unchecked cast warning )、非受检方法调用警告、非受检参数化可变参数类型警告( unchecked parameterized vararg type warning),以及非受检转换警告( unchecked conversion warning ) 。 当你越来越熟悉泛型之后,遇到的警告也会越来越少,但是不要期待一开始用泛型编写代码就可 以正确地进行编译 。

        有许多非受检警告很容易消除 。 例如,假设意外地编写了这样一个声明 :

Set<Lark> exaltation = new HashSet();

        编译器会细致地提醒你哪里出错了 :

        你就可以纠正所显示的错误,消除警告 。 注意,不必真正去指定类型参数,只需要用在 Java 7 中开始引人的菱形操作符( diamond operator) ( < > )将它括起来即可 。 随后编译器就会推测出正确的实际类型参数(在本例中是 Lark):

Set<Lark> exaltation = new HashSet<>();

        有些警告非常难以消除 。 本文主要介绍这种警告示例 。 当你遇到需要进行一番思考的警告时,要坚持住 !要尽可能地消除每一个非受检警告 。 如果消除了所有警告,就可以确保代码是类型安全的这是一件很好的事情 。 这意味着不会在运行时出现 ClassCastException 异常,你会更加自信自己的程序可以实现预期的功能 。

        如果无法消除警告 ,同时可以证明引起警告的代码是类型安全的,(只有在这种情况下 )才可以用一个@SuppressWarnings ("unchecked")注解来禁止这条警告 。 如果在禁止警告之前没有先证实代码是类型安全的,那就只是给你自己一种错误的安全感而已 。 代码在编译的时候可能没有出现任何警告, 但它在运行时仍然会抛出 ClassCastException异常 。 但是如果忽略(而不是禁止)明知道是安全的非受检警告那么当新出现一条真正有问题的警告时,你也不会注意到 。 新出现的警告就会淹没在所有的错误警告声当中 。

        SuppressWarnings 注解可以用在任何粒度的级别中,从单独的局部变量声明到整个类都可以。 应该始终在尽可能小的范围内使用 SuppressWarn ings 注解 。 它通常是个变量声明,或是非常简短的方法或构造器 。 永远不要在整个类上使用 SuppressWarnings ,这么做可能会掩盖重要的警告 。

        如果你发现自己在长度不止一行的方法或者构造器中使用了 SuppressWarnings 注解,可以将它移到一个局部变量的声明中 。 虽然你必须声明一个新的局部变量,不过这么做还是值得的 。 例如,看看 ArrayList 类当 中的 toArray 方法 :

public <T> T[] toArray(T[] a) {
     if (a.length < size)
        return (T[]) Arrays.copyOf(elements, size, a.getClass());
     System.arraycopy(elements, 0, a, 0, size);
     if (a.length > size)
        a[size] = null;
     return a;
}

        如果编译 ArrayList ,该方法就会产生成这条警告 :

        将 SuppressWarnings 注解放在 return 语句中是合法的,因为它不是声明。 你可以试着将注解放在整个方法上,但是在实践中千万不要这么做,而是应该声明一个局部变量来保存返回值,并注解其声明,像这样:

    public <T> T[] toArray(T[] a) {
        if (a.length < size) {
            // This cast is correct because the array we're creating
            // is of the same type as the one passed in,which is T[] .
            @SuppressWarnings ("unchecked") T result =
                    (T[]) Arrays . copyOf(elements, size, a.getClass()) ;
            return result;
        }
        System. arraycopy(elements, 0, a, 0, size);
        if (a.length > size)
            a[size] = null;
        return a;
    }

        这个方法可以正确地编译,禁止非受检警告的范围也会减到最小 。

        每当使用 SuppressWarnings ( “ unchecked " )注解时,都要添加一条注释,说明为什么这么做是安全的 。 这样可以帮助其他人理解代码,更重要的是,可以尽量减少其他人修改代码后导致计算不安全的概率 。 如果你觉得这种注释很难编写,就要多加思考 。 最终你会发现非受检操作是非常不安全的 。

        总而言之,非受检警告很重要 ,不要忽略它们。每一条警告都表示可能在运行时抛出ClassCastException 异常 。 要尽最大的努力消除这些警告。如果无法消除非受检警告,同时可以证明引起警告的代码是类型安全的就可以在尽可能小的范围内使用@SuppressWarnings("unchecked")注解禁止该警告 。 要用注释把禁止该警告的原因记录下来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/846275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在linux系统上安装Nginx

1、关闭防火墙 systemctl disable firewalld.service 2、上传压缩包并解压到目标文件 cd /usr/local tar -zxvf nginx-1.22.0.tar.gz 3、安装Nginx相关依赖 yum install -y gcc-c zlib zlib-developenssl openssl-devel pcre pcre-devel 4、安装完毕后&#xff0c;进入ng…

Spring Boot集成Mybatis-Plus

Spring Boot集成Mybatis-Plus 1. pom.xml导包 <!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--mysql驱动--><dependency><groupId>mysql<…

FastAPI 构建 API 高性能的 web 框架(一)

如果要部署一些大模型一般langchainfastapi&#xff0c;或者fastchat&#xff0c; 先大概了解一下fastapi,本篇主要就是贴几个实际例子。 官方文档地址&#xff1a; https://fastapi.tiangolo.com/zh/ 1 案例1:复旦MOSS大模型fastapi接口服务 来源&#xff1a;大语言模型工程…

大厂容器云实践之路(二)

3-网易蜂巢的DOCKER实践之路 面临问题 场景分析 如何解决 功能性需求&#xff08;基础&#xff09; 第一步 技术支撑公有化 开发流程 场景分析 功能性需求&#xff08;基础&#xff09; 非功能性需求&#xff08;SLA&#xff09; 第二步 产品技术云端化 开发流程 场景分析…

易基因:m5C RNA甲基转移酶及其在癌症中的潜在作用机制|深度综述

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 近年来&#xff0c;5-甲基胞嘧啶&#xff08;m5C&#xff09;RNA修饰已成为通过编码和非编码RNA调控RNA代谢和功能的关键参与者。越来越多的证据表明&#xff0c;m5C可以调控RNA稳定性、…

MOSFET(四):区别JFET

一、JFET及工作原理 N沟道JFET是一种三极结构的半导体器件&#xff0c;包含源极&#xff08;S&#xff09;、漏极&#xff08;D&#xff09;、栅极&#xff08;G&#xff09;工作原理是通过栅源电压控制反型沟道的导电特性。 当栅极-源极电压为零或正电压时&#xff0c;沟道关…

【ChatGLM】大模型之 ChatGLM 部署

目录 1. 资源下载 2. 部署启动 1. 资源下载 HuggingFace 模型权重下载 # install git-lfs git lfs install # download checkpoint # clone the repo git clone https://huggingface.co/THUDM/chatglm-6b 手动模型权重下载 # download checkpoint # clone the repo, ski…

途乐证券|基金重仓股被“撞了一下腰”

中兴通讯昨上演放量长阴走势。 8月7日&#xff0c;A股全天低开低走&#xff0c;创业板领跌。到收盘&#xff0c;沪指跌0.59%&#xff0c;创业板指跌1%。值得一提的是&#xff0c;当天有多只获得基金要点持仓的白马龙头股大跌&#xff0c;其间&#xff0c;在本年二季度颇受基金追…

转载:本地项目上传至git码云步骤(超详细,附图文)

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/stange1/article/details/123877364 文章目录 1、首先在码云上新建一个项目&#xff0c;如下图所示…

ChatGPT访问流量下降的原因分析

​自从OpenAI的ChatGPT于11月问世以来&#xff0c;这款聪明的人工智能聊天机器人就席卷了全世界&#xff0c;人们在试用该工具的同时也好奇该技术到底将如何改变我们的工作和生活。 但近期Similarweb表示&#xff0c;自去ChatGPT上线以来&#xff0c;该网站的访问量首次出现下…

同个局域网内SSH远程Ubuntu系统

文章目录 前言在Ubuntu系统下如何实现不同系统间的SSH连接&#xff08;同一局域网环境&#xff09;1. 确认Ubuntu系统是否安装SSH2. 输入命令3. 输入查询命令4. 取得IP地址5. 查找设备进行连接6. 输入可以通过命令行对Ubuntu系统进行操作 前言 在之前的系列文章中&#xff0c;…

linux onlyOffice docker 离线部署

文章目录 前言1. 安装Docker容器2. 拉取镜像3. 验证 前言 docker 离线安装onlyoffice&#xff0c;如在线安装可直接跳过导出导入镜像步骤&#xff0c;拉取后直接运行。 1. 安装Docker容器 下载文件 wget https://download.docker.com/linux/static/stable/x86_64/docker-19…

动力节点|MyBatis入门实战到深入源码

MyBatis是一种简单易用、灵活性高且高性能的持久化框架&#xff0c;也是Java开发中不可或缺的一部分。 动力节点老杜的MyBatis教程&#xff0c;上线后广受好评 从零基础小白学习的角度出发&#xff0c;层层递进 从简单到深入&#xff0c;从实战到源码 一步一案例&#xff0c;一…

【unity】ShaderGraph实现等高线和高程渐变设色

【unity】ShaderGraph实现等高线和高程渐变设色 等高线的实现思路 方法一&#xff1a; 通过Position节点得到顶点的高度&#xff08;y&#xff09;值&#xff0c;将高度值除去等高距离取余&#xff0c;设定余数的输出边界&#xff08;step&#xff09; 方法二&#xff1a; 将…

IDEA项目实践——Spring当中的切面AOP

系列文章目录 IDEA创建项目的操作步骤以及在虚拟机里面创建Scala的项目简单介绍 IDEA项目实践——创建Java项目以及创建Maven项目案例、使用数据库连接池创建项目简介 IDEWA项目实践——mybatis的一些基本原理以及案例 IDEA项目实践——动态SQL、关系映射、注解开发 IDEA项…

十三、高光谱图像基础

1、各种图像 1.1 高光谱图像 高光谱成像技术的原理基于物体的光谱吸收和反射特性。当光线通过或反射于物体表面时,被物体吸收或反射的光波将发生变化。高光谱成像系统通过对各个波段的频谱进行连续测量,可以获取到物体在不同波段下的光谱信息。通过分析这些光谱数据,我们…

两种方法(JS方法和Vue方法)实现页面渲染

一、需求 根据数据渲染如下页面 二、JS方法 <body><!-- 4. box核心内容区域开始 --><div class"box w"><div class"box-hd"><h3>精品推荐</h3><a href"#">查看全部</a></div><div cl…

演示spring AOP的切入表达式重用和优先级问题以及怎么实现基于xml的AOP

&#x1f600;前言 本篇的Spring-AOP系类文章第五篇讲解了演示spring AOP的切入表达式重用和优先级问题以及怎么实现基于xml的AOP &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助…

c++11 标准模板(STL)(std::basic_fstream)(一)

定义于头文件 <fstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_fstream : public std::basic_iostream<CharT, Traits> 类模板 basic_fstream 实现基于文件的流上的高层输入/输出。它将 std::basic_i…

Linux常用命令——dnf命令

在线Linux命令查询工具 dnf 新一代的RPM软件包管理器 补充说明 DNF是新一代的rpm软件包管理器。他首先出现在 Fedora 18 这个发行版中。而最近&#xff0c;它取代了yum&#xff0c;正式成为 Fedora 22 的包管理器。 DNF包管理器克服了YUM包管理器的一些瓶颈&#xff0c;提升…