接口中的静态常量在项目中的使用,以及固长列表和变长列表

news2025/2/26 9:28:18

先来看一段代码

public interface WrapIgnoreList {
    List<String> KNIFE4J = Arrays.asList(
            "/doc.html",
            "/swagger-resources",
            "/swagger-resources/configuration",
            "/v3/api-docs",
            "/v2/api-docs",
            "/webjars/**");

    List<String> ALL = new ArrayList<>(KNIFE4J);
}

这段代码定义了一个名为 WrapIgnoreList 的接口,其中包含两个 List 类型的静态常量 KNIFE4J 和 ALL。

这个接口的作用很简单,就是通过接口名直接访问这两个静态常量

// 引用 KNIFE4J 中的路径
List<String> knife4jPaths = WrapIgnoreList.KNIFE4J;

// 引用 ALL 中的路径(包含了 KNIFE4J 的所有路径)
List<String> allPaths = WrapIgnoreList.ALL;

静态常量,因为这是接口内的定义,而我们并没有主动去加上权限修饰,出于接口出现的意义,那在 Java 接口内定义的字段默认会有:默认静态,默认常量,默认公共权限。public static final 方便全局共享数据,避免实例化)

通过KNIFE4J变量就能实现对特定的url列表不进行全局响应中的包装。

那为什么还需要创建一个新的列表(ArrayList),而不是直接将 KNIFE4J 作为 ALL 的内容。比如,如果 ALL 只需要包含 KNIFE4J 的内容,直接引用 KNIFE4J 更简洁。这是出于扩展性考虑的,如果以后你需要添加更多路径,就可以在 ALL 的初始化过程中做扩展。

List<String> ALL = new ArrayList<>(KNIFE4J);
ALL.add("/new-path");  // 在 ALL 中添加新的路径

可能不太熟悉列表相关函数的小伙伴可能会问:KNIFE4J不能直接调用add吗?

不行,KNIFE4J 不能直接调用 add() 方法的原因是它是一个List 接口类型的静态常量,具体来说,它是通过 Arrays.asList() 方法创建的一个固定大小的列表。这种列表的大小是不可变的,意味着你不能对它进行修改,如添加或删除元素。

Arrays.asList() 创建的列表特性:
当使用 Arrays.asList() 方法时,返回的是一个固定大小的列表,这个列表不能改变大小,但它的内容(元素)是可以修改的。也就是说:

可以修改元素,例如使用 set() 方法来更新列表中的某个元素。
不能增加或删除元素,例如不能使用 add()、remove() 或 clear() 方法。
举个例子:

List<String> list = Arrays.asList("one", "two", "three");

// 可以修改元素
list.set(0, "changed");

// 不能添加或删除元素
list.add("four");  // 抛出 UnsupportedOperationException

调用 add() 方法会抛出 UnsupportedOperationException,因为 add() 方法试图改变列表的大小。
在这里插入图片描述

如何解决这个问题?

方法一:
如果你想在 KNIFE4J 中添加更多的元素,可以使用 ArrayList 来创建一个可变的列表,像这样:

List<String> KNIFE4J = new ArrayList<>(Arrays.asList(
        "/doc.html",
        "/swagger-resources",
        "/swagger-resources/configuration",
        "/v3/api-docs",
        "/v2/api-docs",
        "/webjars/**"));


// 现在可以添加新元素了
KNIFE4J.add("/new-path");

通过使用 new ArrayList<>(Arrays.asList(…)),你创建了一个新的 ArrayList,它可以自由地修改和调整大小。

这里可能有人会有疑惑,接口内定义的不是静态变量吗?怎么可以调用add()呢?
因为此时虽然KNIFE4J是在接口中定义的静态常量,但它是一个可变对象(ArrayList),这就是它可以调用 add() 的原因。

在 Java 中,final 修饰符只能防止引用的重新赋值,但它不能阻止引用对象内部的内容发生变化。也就是说,你不能改变 KNIFE4J 本身指向的 ArrayList 对象,但你可以改变该 ArrayList 内部的数据。

具体也与ALL列表的情况一样:

public interface WrapIgnoreList {
    List<String> KNIFE4J = Arrays.asList(
            "/doc.html",
            "/swagger-resources",
            "/swagger-resources/configuration",
            "/v3/api-docs",
            "/v2/api-docs",
            "/webjars/**");

    List<String> ALL = new ArrayList<>(KNIFE4J);
}

ALL 本身是 final,这意味着你不能把 ALL 重新赋值为另一个列表。
但是,ALL 是一个可变的 ArrayList,它本身的引用不能变,但这个 ArrayList 可以修改其内容,因此你可以对它调用 add() 等修改操作。

ALL.add("/new-doc");  // 这是合法的,因为它修改了 ArrayList 的内容,而没有改变 ALL 引用本身
ALL = new ArrayList<>();  // 这是非法的,因为 ALL 是 final,不能重新指向一个新的对象

在这里插入图片描述

方法二:
让 KNIFE4J 成为实例变量,在实现了该接口的类中定义实例变量,实例化后就可以用add()方法了。

例如:

public interface WrapIgnoreList {
    // 接口中定义静态常量
    List<String> KNIFE4J = Arrays.asList(
            "/doc.html",
            "/swagger-resources",
            "/swagger-resources/configuration",
            "/v3/api-docs",
            "/v2/api-docs",
            "/webjars/**");
}

// 类中定义实例变量
public class WrapIgnoreListImpl implements WrapIgnoreList {
    List<String> KNIFE4J = new ArrayList<>(Arrays.asList(
            "/doc.html",
            "/swagger-resources",
            "/swagger-resources/configuration",
            "/v3/api-docs",
            "/v2/api-docs",
            "/webjars/**"));

    public void addPath(String path) {
        KNIFE4J.add(path);
    }

//实例化
public class Main {
    public static void main(String[] args) {
        WrapIgnoreListImpl ignoreList = new WrapIgnoreListImpl();
        ignoreList.addPath("/new-path");  // 可以成功调用 add() 方法
    }
}
}

推荐使用方法一。

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

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

相关文章

ApplicationContext获取对象时注解丢失问题及 Arthas 验证方法

引言 在使用 Spring 框架时遇到的一个常见问题&#xff1a;通过 ApplicationContext 获取到的对象无法获取到注解。 本文的目的&#xff1a;探讨这个问题的原因&#xff0c;并展示如何使用 Arthas 工具来验证和解决问题。 问题描述 描述具体的问题场景&#xff1a;通过 Appli…

MySQL—关于数据库的CRUD—(增删改查)

文章目录 关于数据库的使用&#xff1a;1. 数据库的背景知识&#xff1a;2. MYSQL数据库软件的使用&#xff08;MYSQL安装的问题在另一篇博客中讲解&#xff09;。&#xff08;1&#xff09;启动MYSQL数据库软件&#xff08;2&#xff09;开始使用数据库程序&#xff1a;1&…

【微信小程序_13_页面配置与网络数据请】

摘要:本文介绍了微信小程序的页面配置与网络数据请求。页面配置文件可对单个页面进行个性化设置,与全局配置冲突时以页面配置为准。网络数据请求有严格限制,包括只能用 HTTPS 接口并添加到信任列表。可通过wx.request()发起 GET 和 POST 请求,能在页面加载时自动请求数据。…

机器学习-决策树详解

决策树 决策树简介 学习目标 1.理解决策树算法的基本思想 2.知道构建决策树的步骤 【理解】决策树例子 决策树算法是一种监督学习算法&#xff0c;英文是Decision tree。 决策树思想的来源非常朴素&#xff0c;试想每个人的大脑都有类似于if-else这样的逻辑判断&#xff…

使用 python 下载 bilibili 视频

本文想要达成的目标为&#xff1a;运行 python 代码之后&#xff0c;在终端输入视频链接&#xff0c;可自动下载高清 1080P 视频并保存到相应文件夹。 具体可分为两大步&#xff1a;首先&#xff0c;使用浏览器开发者工具 F12 获取请求链接相关信息&#xff08;根据 api 接口下…

Java多线程--实现跑马小游戏

线程的实现方式 继承Thread类&#xff1a;void run()方法没有返回值&#xff0c;无法抛异常实现Runnable接口&#xff1a;void run()方法没有返回值&#xff0c;无法抛异常实现Callable接口&#xff1a;V call() throws Exception 返回结果&#xff0c;能够抛异常 实现Callab…

分类预测|基于鹦鹉优化宽度神经网络的数据分类预测Matlab程序 PO-BLS多特征输入多类别输出

分类预测|基于鹦鹉优化宽度神经网络的数据分类预测Matlab程序 PO-BLS多特征输入多类别输出 文章目录 前言分类预测|基于鹦鹉优化宽度神经网络的数据分类预测Matlab程序 PO-BLS多特征输入多类别输出 一、PO-BLS模型PO-BLS&#xff1a;鹦鹉优化宽度神经网络分类预测原理1. 宽度神…

06DSP学习-利用syscfg配置DAC

在做实验的过程中&#xff0c;有些变量(例如逆变器的电压相位、计算过程中的数字量)是没有办法通过示波器观察的&#xff0c;因此需要将数字量转换为模拟量&#xff0c;一般转换成电压。 DSP有三个片上DAC&#xff0c;本篇博客学习如何使用syscfg配置DAC F28379D DAC介绍 TM…

【opencv】以A4纸为参照物测量物体尺寸(包含:偏移纠正,轮廓检测,绘制轮廓函数)

文章目录 测试结果原图python代码ObjectMeasuremetn.pyutils.py测试结果 原图 python代码 ObjectMeasuremetn.py import cv2 import numpy as np import utilswebcam = False path = ../da

记录一次hiveserver2卡死(假死)问题

问题描述 给开发人员开通了个账号&#xff0c;连接hive进行查询&#xff0c;后来发现&#xff0c;hive服务有时候会卡死&#xff0c;查询不了&#xff0c;连不上&#xff08;所有账号/客户端都连不上hive&#xff09;&#xff0c;但在chd里面看监控&#xff0c;服务器资源状态…

SpringBoot 之 配置 RestTemplate + 跳过https 验证

上截图 目录文件结构 在配置文件下创建下面两个文件 文件内容 HttpsClientHttpRequestFactory.java package org.fri.config;import org.apache.http.ssl.SSLContexts; import org.apache.http.ssl.TrustStrategy; import org.springframework.context.annotation.Configur…

用自己的数据集复现YOLOv5

yolov5已经出了很多版本了&#xff0c;这里我以目前最新的版本为例&#xff0c;先在官网下载源码&#xff1a;GitHub - ultralytics/yolov5: YOLOv5 &#x1f680; in PyTorch > ONNX > CoreML > TFLite 然后下载预训练模型&#xff0c;需要哪个就点击哪个模型就行&am…

JavaSE——String类详解

目录 一、String类简介 二、关于字符串拼接的号 三、StringJoiner类——通过连接符拼接字符串 四、String类常用方法详解 五、instanceof关键字 一、String类简介 String是被final修饰的类&#xff0c;不能被继承&#xff0c;因此不能使用匿名内部类。String是一个常量&a…

leetocode二叉树(六)-翻转二叉树

题目 226.翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。、 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#x…

【STM32项目】基于stm32四足跳舞机器人设计与实现(完整工程资料源码)

目录 前言 一、设计目的&#xff1a; 1.1 设计背景 1.2 设计意义 1.3 设计功能 二、硬件部分 2.1 sg90舵机&#xff08;8个&#xff09; 2.2 stm32f103c8t6&#xff08;1个&#xff09; 2.3 OLED显示屏&#xff08;1个&#xff09; 2.4 HC-05蓝牙模块&#xff08;1个&#xff…

C语言malloc超级详细用法和calloc 扩展

前提 在C语言中&#xff0c;malloc&#xff08;内存分配&#xff09;用于动态分配内存。它是标准库中的一部分&#xff0c;包含在 <stdlib.h> 头文件中。使用 malloc 可以在运行时请求所需的内存空间&#xff0c;而不是在编译时就确定内存大小。 语法 在cplusplus中mall…

LeetCode岛屿数量

题目描述 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维网格&#xff0c;请你计算网格中岛屿的数量。 岛屿总是被水包围&#xff0c;并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外&#xff0c;你可以假设该网…

Elasticsearch生产应用(进阶版),不知道怎么提升生产ES集群性能,看这篇就可以了

这里借助kibana进行修改相应的配置 elasticsearch集群的部署&#xff0c;详情请看上一篇文章&#xff1a; Elasticsearch最新版快速入门看这个就可以了-CSDN博客 基础ES集群运维篇可以查看 Elasticsearch 生产应用&#xff08;实用版&#xff09;&#xff0c;知晓这些&…

“探索Adobe Photoshop 2024:订阅方案、成本效益分析及在线替代品“

设计师们对Adobe Photoshop这款业界领先的图像编辑软件肯定不会陌生。如果你正考虑加入Photoshop的用户行列&#xff0c;可能会对其价格感到好奇。Photoshop的价值在于其强大的功能&#xff0c;而它的价格也反映了这一点。下面&#xff0c;我们就来详细了解一下Adobe Photoshop…

Python语言实现梯度提升树 (Gradient Boosting Machines, GBM)算法

梯度提升树&#xff08;Gradient Boosting Machines, GBM&#xff09;是一种集成学习方法&#xff0c;通过迭代地训练决策树&#xff0c;并让每棵新的树拟合前一棵树的残差&#xff0c;从而逐步提高模型的准确率。下面是一个简单的Python实现GBM的例子&#xff1a; 实现思路&a…