首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何将map定义为常量对象,而不是在将反复创建的方法中定义

要将map定义为常量对象,可以使用Java中的Collections.unmodifiableMap()方法来实现。该方法返回一个不可修改的Map对象,即常量对象。

下面是一个示例代码:

代码语言:txt
复制
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class ConstantMapExample {
    private static final Map<String, Integer> CONSTANT_MAP;

    static {
        Map<String, Integer> tempMap = new HashMap<>();
        tempMap.put("key1", 1);
        tempMap.put("key2", 2);
        tempMap.put("key3", 3);
        CONSTANT_MAP = Collections.unmodifiableMap(tempMap);
    }

    public static void main(String[] args) {
        // 尝试修改常量Map会抛出UnsupportedOperationException异常
        // CONSTANT_MAP.put("key4", 4);

        // 访问常量Map
        System.out.println(CONSTANT_MAP.get("key1")); // 输出: 1
        System.out.println(CONSTANT_MAP.get("key2")); // 输出: 2
        System.out.println(CONSTANT_MAP.get("key3")); // 输出: 3
    }
}

在上述示例中,我们使用静态代码块来初始化一个临时的HashMap,并将其传递给Collections.unmodifiableMap()方法来创建一个不可修改的常量Map对象。最后,将该常量Map赋值给CONSTANT_MAP变量。

通过这种方式,我们可以确保CONSTANT_MAP是一个常量对象,不可被修改。如果尝试修改该Map,会抛出UnsupportedOperationException异常。

这种方式适用于需要在多个方法中共享同一个不可修改的Map对象的场景,避免了在每个方法中重复创建Map的开销。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++反射调用.NET(二) 定义数据接口 绑定委托方法 使用SOD DTO 对象 .NET对象转换到C++结构体为何不使用序列化问题

反射调用返回复杂对象.NET方法 定义数据接口 上一篇C++反射调用.NET(一),我们简单介绍了如何使用C++/CLI并且初步使用了反射调用.NET程序集简单方法,今天我们看看如何在C++...PDF.NET SOD框架一个实体构造器,调用CreateEntity方法可以根据一个接口创建一个动态实体类对象,通过这种方式,我们可以不用去关心实体类构造细节,仅仅关心方法调用数据接口。...虽然方法返回是IUserInfo,但是对于我们C++程序端来说,它并不知道IUserInfo这个接口对象,因为此接口没有C++程序端定义,C++程序也没用引用它所在.NET程序集,所以我们反射调用...GetUserByID 方法时候,只能使用“弱类型”Object,幸运是我们调用是返回值,不是参数(反过来就不行,后面会有介绍),创建下面的委托对象是合法: Func<int, Object...所以这里涉及到2个问题: 1,从Object对象取出数据; 2,数据转换并且赋值给C++本地数据结构 对于第一个问题,我们可以反射DTO对象属性,然后跟本地数据接口一一对应,但是,本来我们已经反射调用方法

2.9K70

Java源码分析:Guava之不可变集合ImmutableMap源码分析

Google Guava官方教程,Immutable前缀集合被定义不可变集合,包括ImmutableSet、 ImmutableMap等,何为不可变集合?...那么,什么是可再修改呢,像Jdkmap、list等,创建后,还可以再通过put()或者add()反复新增或者修改,这种就是可再修改集合。既然是不可再修改集合,是不是就一定不能再修改了呢?...也不是,其实,通过反射还是可以被修改,但这已经不是不可变集合之所以存在初衷了。 总结一句话是,不可变集合是线程安全且可当成常量使用。...在这个反复调用过程, 只有entries[size++] 是一直新增变化。...这时,再通过put方法调用时,例如,以上边定义dayMap例,某个方法里,再试图通过dayMap..put("Monday","今天上英语课") 来修改或者新增map数据时,这里调用put就已经不是内部类

62920

关于接口可维护性一些建议

总结了大概有如下几条建议: 接口注释中加入接口文档链接 调用接口处写上被调用接口文档链接 接口源代码发布到私服仓库 对于状态值常量,优先在接口参数类或者返回值类定义 如果使用 Map 对象作为传输载体...,要提供 Key 值定义常量 针对 Map 返回值,可以考虑使用 Map 转化成对象 尽可能简化接口依赖 只传递必要字段,尽量避免大而全接口 接口参数和返回值原始数据打印到日志 RPC 接口类名及方法打印到日志...2.6 针对 Map 返回值,可以考虑使用 Map 转化成对象 针对 Map 处理,即使按照《如果使用 Map 对象作为传输载体,要提供 Key 值定义常量》(https://www.diguage.com...一个更简单方法是自定义一个类型,使用工具 Map 对象转化成自定义类型对象。这样就可以直接使用方法调用来取值。 Java ,可以直接使用 Jackson 来完成这个转换工作。...这里存在一种情况需要特别说明,状态值定义需要在本系统业务模块代码中使用,可以接口依赖加入到改业务模块依赖不是反过来。为什么会这样操作?一个核心思想是保持对外暴露接口纯净性。

18040

jvm类加载机制

类得生命周期 讲类加载机制前,我们都知道一个对象生命周期指的是这个对象创建到销毁过程,这个国政简单一句话概括:从JVM字节码文件加载进内存到卸载出内存为止。...假设一个类变量定义:publicstaticintvalue=3; 那么变量value准备阶段过后初始值0,不是3,因为这时候尚未开始执行任何Java方法,而把value赋值3putstatic...对于同时被static和final修饰常量,必须在声明时候就为其显式地赋值,否则编译时不通过;只被final修饰常量则既可以声明时显式地其赋值,也可以类初始化时显式地其赋值,总之,使用前必须其显式地赋值...如果在数组初始化时没有对数组各元素赋值,那么其中元素根据对应数据类型被赋予默认零值 4....下面附上对象得初始化时机: 使用new关键字创建对象 使用Class类newInstance方法(反射机制) 使用Constructor类newInstance方法(反射机制) 使用Clone方法创建对象

27140

Dart语言指南(一) 顶

强类型模式下,静态和运行时检查确保您代码是安全,帮助您捕获开发错误,不是在运行时。强力模式Dart 1.x 是可选,但在Dart 2.0不是可选。...例如,您可以使用Map() 构造函数创建map对象, 使用代码 new Map()....: 'partridge'}; gifts['fourth'] = 'calling birds'; assert(gifts.length == 2); 要创建一个编译时常量map对象,请在map文字之前添加...Symbols Symbol对象表示Dart程序声明操作符或标识。你可能不会需要使用这些符号,但他们对于由名字指向API是很有用,因为时常要改变是标识符名字,不是标识符符号....比较对象必须都是同一个类实例 (不是其任何子类型), 而且类没有复写==. 枚举类型 非常适用于switch 语句.

2.7K20

如何优雅编写代码(持续更新......)

尽量不要在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,并且是整个应用基础常量。...4)POJO是DO/DTO/BO/VO统称,禁止命名成xxxPOJO 不允许任何魔法值(即未经预先定义常量)直接出现在代码。...在上方详细说明,不是简单地注释掉。如果无用,则删除。对于暂时被注释掉,后续可能恢复使用代码片断,注释代码上方,统一规定使用三个斜杠(///)来说明注释掉代码理由。...注意负载因子(即loader factor)默认为0.75,如果暂时无法确定初始值大小,请设置16(即默认值). 使用entrySet遍历Map类集合KV,不是keySet方式进行遍历。...并发处理 创建线程或线程池时请指定有意义线程名称,方便出错时回溯。 线程资源必须通过线程池提供,不允许应用自行显式创建线程。

77641

java面试题汇总一(会持续更新)

创建一个新数组,从后到前循环遍历每个元素,取出元素依次顺序放入新数组 32.形参与实参 形参:全称为“形式参数”,是定义方法名和方法时候使用参数,用于接收调用该方法时传入实际值;实参:全称为...因为”aa”与”bb”都是常量常量值不能改变,当执行字符串拼接时候,会创建一个新常量是” aabbb”,有将其存到常量池中。 43.下javamath类有那些常用方法?...\==可以判断基本数据类型值是否相等,也可以判断两个对象指向内存地址是否相同,也就是说判断两个对象是否是同一个对象,Equlas通常用来做字符串比较。 47.如何将字符串反转?...()方法; finally区块标志,用于try语句中; 作用 final用于标识常量关键字,final标识关键字存储常量池中(在这里final常量具体用法将在下面进行介绍); finalize...如果在子类定义方法与其父类有相同名称和参数,我们说该方法被重写 (Override)。子类对象使用这个方法时,调用子类定义,对它而言,父类定义如同被"屏蔽"了。

45600

Dart final 和 const 区别

用final修饰变量,必须在定义时将其初始化,其值初始化后不可改变; const用来定义常量。 它们区别在于,const比final更加严格。...final只是要求变量初始化后值不变,但通过final,我们无法在编译时(运行之前)知道这个变量值;const所修饰是编译时常量,我们在编译时就已经知道了它值,显然,它值也是不可改变。...atm = 1.01325 * bar; // 值表达式变量必须是编译时常量(bar); var c = 12; // atm = 1 * c; //出错,因为c不是一个编译时常量...高级使用 当final修饰值赋一个包含成员变量或方法对象时: 对象成员值能被修改,对于能够添加成员类(如List、Map)则可以添加或删除成员 变量本身实例不能被修改 class Point{...setter方法; p.x=2; // 正常执行,修改是变量属性值,不是变量引用对象; print(''p.x); // 打印 2 var foo = const

3.1K10

java容器类—概述

HashSet是通过MapHashMap实现TreeSet是通过MapTreeMap实现。...,抽象类实现接口中若干或所有方法,这样以下一些类仅仅需直接继承该抽象类,并实现自己须要方法就可以,不用实现接口中所有抽象方法。...你能够用add()方法向Collection对象中加元素。 2 Map:一组以“键-值”(key-value)形式出现pair,Map也不接受反复key值。...假设一个Set可变元素改变了自身状态导致Object.equals(Object)=true导致一些问题。 Set推断两个对象同样不是使用==运算符,而是依据equals方法。也就是说。...还有peek方法得到栈顶元素,empty方法測试堆栈是否空,search方法检測一个元素堆栈位置。Stack刚创建后是空栈。

52710

对象拷贝 - 优雅解决方案 Mapstruct

MapStruct 拥有的优点: 使用普通方法调用不是反射来快速执行,他会在编译器生成相应 Impl 方法调用时直接通过简单 getter/setter调用不是反射或类似的方式值从源复制到目标...方法2> Java 8或更高版本时,可以直接在映射器界面实现自定义方法作为默认方法。...PersonDto personToPersonDto(Person person) {         // hand-written mapping logic     } } 映射器也可以定义抽象类形式不是接口...: 对象如果包含另一个对象引用,此时只需引用对象类型定义映射方法即可 @Mapper public interface CarMapper {     CarDto carToCarDto...如果需要,可以使用 @ValueMapping 注释帮助source enum常量映射具有其他名称常量 @Mapper public interface OrderMapper {

6.6K20

SQL Serversp_executesql系统存储过程

stmt 中指定每个参数都必须在 @params 定义。如果 stmt Transact-SQL 语句或批处理不包含参数,则不需要 @params。该参数默认值 NULL。...[@param1 =] ‘value1’ 参数字符串定义第一个参数值。该值可以是常量或变量。必须 stmt 包含每个参数提供参数值。...如果 stmt 包含 Transact-SQL 语句或批处理没有参数,则不需要值。 n 附加参数占位符。这些值只能是常量或变量,不能是更复杂表达式,例如函数或使用运算符生成表达式。...说明 如果语句字符串对象不是全限定名,则该执行计划不会被重用。...尽管两种方法生成批处理数相同,但因为 sp_executesql 生成 INSERT 字符串相似,所以查询优化程序更有可能反复使用执行计划。

1.6K10

枚举类型

这里限制指的是对枚举类型所能创建对象个数进行了限制!他不像普通class类那样可以创建无数对象,他只能创建固定数目的对象,而且这些对象定义枚举类型时候就已经枚举类内部创建好了!...如下图所示: ​ 枚举类不能继承,因为枚举默认继承Enum类 ​ 枚举可以实现接口 3.1、Enum抽象类常见方法 方法 方法说明 String name() 返回此枚举常量名称,在其枚举声明对其进行声明...(Arrays.toString(values)); int index = tue.ordinal();//返回该枚举常量枚举类索引 System.out.println...{ public abstract void method(); } //方式二 //枚举类不实现抽象类方法让每个枚举常量以==匿名内部类==方式实现 public enum Week...集合接口,他可以一个枚举类转换成一个Map集合!

79910

TF入门02-TensorFlow Ops

当用户TensorBoard激活TensorFlow程序执行某些操作时,这些操作导出到事件日志文件。...我们可以numpy类型传送到TF ops。 tf.ones([2,2], np.float32) TF,numpy数组用于表示tensor值。...模型训练过程,我们希望模型权重参数能不断优化,因此常量不适用于这种场景 常量值作为graph定义一部分被存储和序列化,每次graph加载时,常量值都需要复制一份;变量是分开存储,可能放在单独参数服务器上...我们可以使用feed_dict来完成这项操作:feed_dict是一个字典,其中键placeholder对象名字(不是字符串),值传送值。...如果循环10万次,会导致graph定义极速膨胀。 我们应该避免使用Lazy Loading,方法是: op定义和运行分别开来。

1.6K30

『Flutter开发实战』一小时掌握Dart语言

'; // 代码中文解释 var s = r' raw 字符串,转义字符串 \n 会直接输出 “\n” 不是转义换行。'...不是 Set (Creates a map, not a set.)...但是 Dart 可以任何非 null 对象作为异常抛出不局限于 Exception 或 Error 类型。...} 如果你声明一个实例变量时候就将其初始化(不是构造函数或其它方法),那么该实例变量值就会在对象实例创建时候被设置,此过程早于执行构造函数以及它初始化器列表。...可以静态方法作为编译时常量。例如,你可以静态方法作为一个参数传递给一个常量构造函数。 泛型 如果你查看数组 API 文档,你会发现数组 List 实际类型 List。

4.9K10

深入理解Java虚拟机05–虚拟机类加载机制「建议收藏」

二.加载过程 1、 加载(loading) 三件大事 1、通过类全限定名来定义这个类二进制流 2、字节流代表静态存储结构变成方法运行时数据结构 3、方法区生成一个java.lang.Class...对象,作为方法区数据访问入口 自定义类加载器:重写loadClass()方法 一个区别:数组类本身不通过类加载器创建,而是由虚拟机直接创建,但是数组元素还是需要类加载器创建; 2、 连接 (1)、...,保证解析动作能正常运行; 验证是重要但不是必须,对于反复验证呢过Class可以考虑使用-Xverify:none参数来关闭大部分类验证措施; (2)、准备:类变量分配内存并设置初始值(如int...被动引用 子类引用父类静态字段,只初始化父类,不会触发初始化子类 通过数组定义来引用类,不会触发此类初始化 常量在编译阶段会存入到调用类常量池中,本质上没有直接应用调用到定义常量类,因此定义常量这个类不会触发初始化...但是,也存在我们本类引用到了其他类,比如说父类,其他类常量。如果,我们操作不是上述主动引用,其结果是没有触发本Class初始化,而是间接触发了别的Class进行初始化工作。

24820

简述JVM基础(五):虚拟机类加载机制

1、 加载(loading) 三件大事 1、通过类全限定名来定义这个类二进制流 2、字节流代表静态存储结构变成方法运行时数据结构 3、方法区生成一个java.lang.Class对象,作为方法区数据访问入口...自定义类加载器:重写loadClass()方法 一个区别:数组类本身不通过类加载器创建,而是由虚拟机直接创建,但是数组元素还是需要类加载器创建; 2、 连接 (1)、 验证 确保Class文件字节流包含信息符合当前虚拟机要求...确定程序语义是合法,保证方法运行时不会危害虚拟机; 符号引用验证:验证类是否找到到(NoSuchMothodError),访问性是否正常等等,保证解析动作能正常运行; 验证是重要但不是必须,对于反复验证呢过...被动引用 子类引用父类静态字段,只初始化父类,不会触发初始化子类 通过数组定义来引用类,不会触发此类初始化 常量在编译阶段会存入到调用类常量池中,本质上没有直接应用调用到定义常量类,因此定义常量这个类不会触发初始化...但是,也存在我们本类引用到了其他类,比如说父类,其他类常量。如果,我们操作不是上述主动引用,其结果是没有触发本Class初始化,而是间接触发了别的Class进行初始化工作。

49110

Netty 源码解析 ——— ChannelConfig 和 Attribute

如果返回null,则说明当前创建tempConstant就为name所对应常量;否则,putIfAbsent返回name已经对应常量值返回。...这里,我们通过ChannelOption来实现配置设置,ChannelOption已经常用配置项预定义为了常量供我们直接使用,同时ChannelOption一个主要功能就是让特定变量值给类型化...其实Attribute就是一个属性对象,这个属性名称为AttributeKey key,属性T value。...如上面所说,Attribute就是一个属性对象,这个属性名称为AttributeKey key,属性T value。...因此map我们可以通过AttributeKey key获取Attribute,从而获取Attributevalue(即,属性值)。

1.4K20

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券