Java Interface 是常量存放的最佳地点吗?

三维(点云)语义分割概述以及方法总结 语义分割 语义分割需要两部分 classification: 需要全局信息 segmentation:更加依赖全局信息和局部信息 一般的网络结构是: 提特征-特征映射-特征图压缩(降维)-全连接-分类,其实就是encoder-decoder的过程, 比如在二维的的pspnet,fcn等等 0. 三维表示的数据结构 Point cloud 无序性 点云实际上是无序的,比如有8个点云,你放到... 阅读详情
Java Interface 是常量存放的最佳地点吗?

bright (brightsee@21cn.com)

由于java interface中声明的字段在编译时会自动加上static final的修饰符,即声明为常量。因而interface通常是存放常量的最佳地点。然而在java的实际应用时却会产生一些问题。

问题的起因有两个,第一,是我们所使用的常量并不是一成不变的,而是相对于变量不能赋值改变。例如我们在一个工程初期定义常量∏=3.14,而由于计算精度的提高我们可能会重新定义∏=3.14159,此时整个项目对此常量的引用都应该做出改变。第二,java是动态语言。与c++之类的静态语言不同,java对一些字段的引用可以在运行期动态进行,这种灵活性是java这样的动态语言的一大优势。也就使得我们在java工程中有时部分内容的改变不用重新编译整个项目,而只需编译改变的部分重新发布就可以改变整个应用。

讲了这么多,你还不知道我要说什么吗?好,我们来看一个简单的例子:

有一个interface A,一个class B,代码如下:


//file A.java
public interface A{
	String name = "bright";
}

//file B.java
public class B{
	public static void main(String[] args){
		System.out.println("Class A's name = " + A.name);
	}
}

够简单吧,好,编译A.java和B.java。

运行,输入java B,显然结果如下:


Class A's name = bright

我们现在修改A.java如下:


//file A.java
public interface A{
	String name = "bright sea";
}

编译A.java后重新运行B class,输入java B,注意:结果如下


Class A's name = bright

为什么不是"Class A's name = bright sea"?让我们使用jdk提供的反编译工具javap反编译B.class看个究竟,输入:javap -c B ,结果如下:


Compiled from B.java
public class B extends java.lang.Object {
    public B();
    public static void main(java.lang.String[]);
}

Method B()
   0 aload_0
   1 invokespecial #1 <Method java.lang.Object()>
   4 return

Method void main(java.lang.String[])
   0 getstatic #2 <Field java.io.PrintStream out>
   3 ldc #3 <String "Class A's name = bright">
   5 invokevirtual #4 <Method void println(java.lang.String)>
   8 return

注意到标号3的代码了吗?由于引用了一个static final 的字段,编译器已经将interface A中name的内容编译进了class B中,而不是对interface A中的name的引用。因此除非我们重新编译class B,interface A中name发生的变化无法在class B中反映。如果这样去做那么java的动态优势就消失殆尽。

解决方案,有两种解决方法。

第一种方法是不再使用常量,将所需字段放入class中声明,并去掉final修饰符。但这种方法存在一定的风险,由于不再是常量着因而在系统运行时有可能被其他类修改其值而发生错误,也就违背了我们设置它为常量的初衷,因而不推荐使用。

第二种方法,将常量放入class中声明,使用class方法来得到此常量的值。为了保持对此常量引用的简单性,我们可以使用一个静态方法。我们将A.java和B.java修改如下:


//file A.java
public class A{
	private static final String name = "bright";
	public static String getName(){
		return name;
	}
}

//file B.java
public class B{
	public static void main(String[] args){
		System.out.println("Class A's name = " + A.getName());
	}
}

同样我们编译A.java和B.java。运行class B,输入java B,显然结果如下:

Class A's name = bright

现在我们修改A.java如下:


//file A.java
public class A{
	private static final String name = "bright";
	public static String getName(){
		return name;
	}
}

我们再次编译A.java后重新运行B class,输入java B:结果如下


Class A's name = bright sea

终于得到了我们想要的结果,我们可以再次反编译B.class看看class B的改变,输入:

javap -c B,结果如下:


Compiled from B.java
public class B extends java.lang.Object {
    public B();
    public static void main(java.lang.String[]);
}

Method B()
   0 aload_0
   1 invokespecial #1 <Method java.lang.Object()>
   4 return

Method void main(java.lang.String[])
   0 getstatic #2 <Field java.io.PrintStream out>
   3 new #3 <Class java.lang.StringBuffer>
   6 dup
   7 invokespecial #4 <Method java.lang.StringBuffer()>
  10 ldc #5 <String "Class A's name = ">
  12 invokevirtual #6 <Method java.lang.StringBuffer append(java.lang.String)>
  15 invokestatic #7 <Method java.lang.String getName()>
  18 invokevirtual #6 <Method java.lang.StringBuffer append(java.lang.String)>
  21 invokevirtual #8 <Method java.lang.String toString()>
  24 invokevirtual #9 <Method void println(java.lang.String)>
  27 return

注意标号10至15行的代码,class B中已经变为对A class的getName()方法的引用,当常量name的值改变时我们只需对class A中的常量做修改并重新编译,无需编译整个项目工程我们就能改变整个应用对此常量的引用,即保持了java动态优势又保持了我们使用常量的初衷,因而方法二是一个最佳解决方案。

关于作者
bright:软件开发工程师,一直从事B/S架构下应用开发的工作,主要采用基于J2EE技术。你可以通过brightsee@21cn.com与他联系。
STM32F103C8T6通过ESP8266连接阿里云物联网平台(附代码) STM32F103C8T6连接阿里云物联网平台(1)—阿里云lot Studio控制 Web开发 分享一下自己使用stm32f103c8t6通过ESP_01模块连接阿里云物联网平台,实现温湿度上传和控制命令下达的过程,能力有限,用的是最简单的方法,如有错误,多多担待。 一、硬件选型 1、 stm32f103c8t6 2、ESP_01 wifi模块 3、其他 二、硬件连接 WSP_01 STM32F103C8T6 RXD PA2 TXD PA3 RES PA4 VCC 3.3 阅读详情

相关推荐

实战拆解:RAG vs Agent在金融风控中的性能对比

2024年上半年我帮某华东地区城商行做零售交易反欺诈系统升级时,技术团队曾发生过一次激烈争论:一派认为应该优先上RAG(检索增强生成)方案,成本低、落地快、合规性好;另一派坚持要上Agent(智能体)方案,推理能力强、能应对复杂新型欺诈。最终我们做了完整的AB测试,结论是两者没有绝对的优劣,只有场景适配的差异:RAG适合高并发、低时延的实时风控场景,Agent适合低并发、高准确率要求的事后核查/大额审批场景,两者结合的 hybrid 方案能覆盖95%以上的风控需求。本文我会结合真实项目的测试数据,从核心概念

AI天才研究院 251

常量const

常量:程序运行期间,固定不变的量 分类: ①字符串常量:双引号引起来的部分    "abc"、"123" ②整数常量:直接写上的数字,没小数点。 100、0、-20 ③浮点型常量(小数):直接写上的数字,有小数点。 2.5 ④字符常量:单引号引起来的单个字符 'A'、'b'、'2'(字符也可以是中文) ⑤布尔常量:只有两个值  true(真)、false(假) ⑥空常量:null (代表没有任何数据、也不能使用) 写字符串常量ABC ...

m0_58203979的博客 148

NMOS管和PMOS管做开关控制电路

NMOS管和PMOS管做开关控制电路

while(1) 3万+

Java中的constant是什么,Java中定义常量(Constant)的几种方法

原文网址:https://www.cnblogs.com/hyhong/p/5206809.html1、定义一个接口常量2、定义枚举3、定义一个类,类中属性用static final修饰 publicstaticfinalStringSUNDAY="SUNDAY"; (只有属性没有方法)4、定义一个类,类中熟悉用static final修饰 publicstaticfin...

weixin_35756690的博客 2118

华为CCA架构软件栈VehicleStack解析:3层服务化设计与AOS/VOS双核OS

本文深入解析华为CCA架构下的VehicleStack软件平台,重点介绍其三层服务化设计(硬件抽象层、服务框架层、应用层)与AOS/VOS双核操作系统协同机制。该架构通过计算与通信的深度融合,推动汽车电子电气架构向集中式发展,为智能汽车提供灵活、高效的软件定义汽车解决方案。

weixin_33491377的博客 323

S7-1200控制S120变频器

②:硬件目录下,添加实物S120设备进行组态(其它现场设备--PROFINET IO--DRIVES......②:双击S120进行IP地址和设备名称设置(注:此处要与STATER软件设置S120一致)M10.0接通时,电机开始运行,M10.0断开,电机停止,调试完成。①:将S7-1200与S120进行通讯连线。④:STATER软件下设置与组态一致的报文。①:点击添加新设备,按实物进行设备组态。②:打开OB1,编写启动停止程序。①:查看S120报文地址。②:模块下添加DO矢量。③:子模块下添加报文。

weixin_38261173的博客 4867

Java中定义常量(Constant)的几种方法

原文网址:https://www.cnblogs.com/hyhong/p/5206809.html 1、定义一个接口常量 2、定义枚举 3、定义一个类,类中属性用static   final修饰 public static final String SUNDAY = "SUNDAY";  (只有属性没有方法) 4、定义一个类,类中熟悉用static   final修饰 public st...

lhw_csd的博客 2万+

手把手教你用GD32F407VET6的EXMC驱动外部SRAM,搞定大内存需求

本文详细介绍了如何使用GD32F407VET6的EXMC外设驱动外部SRAM,解决嵌入式开发中的大内存需求问题。通过硬件连接方案、EXMC时序配置与初始化步骤,以及软件集成与内存管理技巧,帮助开发者快速实现内存扩展。特别适合需要处理图形显示缓冲、音频处理等大内存场景的GD32F407开发者。

weixin_30752699的博客 346

java const用法_尽可能使用const(示例代码)

1、const用于定义常量编译器可以对其进行静态数据类型检查2、const可用于修饰形式参数若你在编写函数时,并没有打算改变参数,这是就应该将参数的类型设置为const reference,这样既可以保证参数的常量性,又提高了传值的效率3、const修饰返回值若函数的返回值时const pointer,则返回值不可被直接修改,而且返回值必须赋值给const同种类型令函数返回一个常量值,该const...

weixin_36168780的博客 6989

【数据同化第二期】数据同化中三大理论基础之一(最小方差估计)

【数据同化第二期】深入理解数据同化及经典案例(最小方差估计)

WW、forever的博客 1596

AI上推荐 之 协同过滤

㐇

Miracle8070 1万+

Interface与常量存放

首先,Interface常用来存放常量。与定义在类中的常量区别:1、常量定义在类中,相对其他类来说是可见可用的。 2、常量定义在接口中,其他类来要用时,该类要实现接口,方可使用。 另外,在Interface中定义常量也有不足之处。主要是由于Interface中的fields默认为static final, 故通常实现Interface的类(假设为C)在编译的时候,已经把Interface中

Closed 2067

vue2/3 - 详细实现内网使用离线百度地图功能,百度地图如何离线加载详细教程(内网部署及使用),在vue中无需网络离线使用百度地图相关功能,提供最新完整的瓦片资源下载及相关工具(示例代码,一键复制

vue,vue2,vue3,百度地图,离线使用百度地图,百度地图瓦片官方下载,vue内网使用百度地图离线无网络,断网情况下使用百度地图,vue离线百度地图教程,如何实现内网部署百度地图,无需联网离线使用,vue+ts实现离线百度地图 内网离线百度地图,如何在百度地图Vue项目中下载离线地图,百度离线地图加载不出来,百度地图离线使用不显示怎么办,怎么解决vue内网使用离线百度地图加载失败问题,vue实现离线地图+百度瓦片,vue引入百度离线地图,vue项目如何使用离线百度地图和自定义地图样式,百度离线地图的下

✅ 精选推荐文章 1万+

Java Interface 是常量存放的最佳地点吗

  由于java interface中声明的字段在编译时会自动加上static final的修饰符,即声明为常量。因而interface通常是存放常量的最佳地点。然而在java的实际应用时却会产生一些问题。由于java interface中声明的字段在编译时会自动加上static final的修饰符,即声明为常量。因而interface通常是存放常量的最佳地点。然而在java的实际应用时却

燕窝 546

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java interface常量_Java Interface 是常量存放的最佳地点吗?

由于Java编程 interface中声明的字段在编译时会自动加上static final的修饰符,即声明为常量。因而interface通常是存放常量的最佳地点。然而在Java编程的实际实际运用时却会产生一部份疑难问题。 疑难问题的起因有两个,NO·1,是咱们所应用的常量并否则一成不变的,而是相对于变量别赋值改变。例如咱们在唯一工程初期定义常量∏=3.14,而由于计算精度的升高咱们估计会重新定义∏...

weixin_35732670的博客 617

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java Interface 是常量存放的最佳地点吗? (转)

Java Interface 是常量存放的最佳地点吗? (转)[@more@]Java Interface 是常量存放的最佳地点吗? 2003-6-182133091.gif" width=8 border=0> ...

csd3176的博客 178

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java Interface 是常量存放的最佳地点吗?(接口中写常量)

由于java interface中声明的字段在编译时会自动加上static final的修饰符,即声明为常量。 因而interface通常是存放常量的最佳地点。然而在java的实际应用时却会产生一些问题。 问题的起因有两个, 第一,是我们所使用的常量并不是一成不变的,而是相对于变量不能赋值改变。例如我们在一个工程初期定义常量a=3.14,而由于计算精度的提高我们可能会重新定义a=3.1415...

长河的博客 5694
上一篇: 如何迅速成为Java高手
下一篇: 我认为JSP有问题
jstml
博客等级 码龄26年 1粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值