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

Java Interface 是常量存放的最佳地点吗?由于 Java 编程 interface 中声明的字段在编译时会自动加上 staticfinal 的修饰符 即声明为常量 因而 interface 通常是存放常量的最佳地点 然而在 Java 编程的实际实际运用时却会产生一部份疑难问题 疑难问题的起因有两个 NO 1 是咱们所应用的常量并否则一成不变的 而是相对于变量别赋值改变 例如咱们在唯一工程初期定义常量 3 14 而由于计算精度的升高咱们估计会重新定义 3 14159 此时整个项目对此常量的引用都因该做出改变 第二 Java 编程是动态语句语言 与 c 之类的静态

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

疑难问题的起因有两个,NO·1,是咱们所应用的常量并否则一成不变的,而是相对于变量别赋值改变。例如咱们在唯一工程初期定义常量∏=3.14,而由于计算精度的升高咱们估计会重新定义∏=3.14159,此时整个项目对此常量的引用都因该做出改变。第二,Java编程是动态语句语言。与c++之类的静态语句语言不相同,Java编程对一部份字段的引用能够在运行期动态停止,这种灵活性是Java编程那样的动态语句语言的一大优势。也就使得咱们在Java编程工程中有时部份内容的改变不用重新编译整个项目,而只需编译改变的部份重新正式发布就能够改变整个实际运用。

讲了这么多,你还不明白我要说什么吗?好,咱们来看唯一简单的例子:

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

//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帮助的反编译道具Java编程p反编译B.class看个究竟,输入:Java编程p -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
4 return

Method void main(Java编程.lang.String[])
0 getstatic #2
3 ldc #3
5 invokevirtual #4
8 return

留意到标号3的代码Code了吗?由于引用了唯一static final 的字段,编译器已经将interface A中name的内容编译进了class B中,而否则对interface A中的name的引用。因此除非咱们重新编译class B,interface A中name除了的变化无法在class B中反映。假如那样去做那么Java编程的动态优势就消失殆尽。

解决方案,有两种解决窍门。

NO·1种窍门是不再应用常量,将所需字段放入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的改变,输入:

Java编程p -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
4 return

Method void main(Java编程.lang.String[])
0 getstatic #2
3 new #3
6 dup
7 invokespecial #4
10 ldc #5
12 invokevirtual #6
15 invokestatic #7
18 invokevirtual #6
21 invokevirtual #8
24 invokevirtual #9
27 return

留意标号10至15行的代码Code,class B中已经变为对A class的getName()窍门的引用,当常量name的值改变时咱们只需对class A中的常量做改正并重新编译,无需编译整个项目工程咱们就能改变整个实际运用对此常量的引用,即保持了Java编程动态优势又保持了咱们应用常量的初衷,因而窍门二是唯一最佳解决方案。
详细内容:
http://www-900.ibm.com/developerWorks/cn/Java编程/l-Java编程-interface/index.shtml?n-j-04281

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/178708.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午4:40
下一篇 2026年3月26日 下午4:40


相关推荐

  • Python面试常见问题_python面试问题总结

    Python面试常见问题_python面试问题总结Python是什么?简述并说明优点和缺点?Python是一种面向对象的解释性计算机编程语言,它是结合了解释性、编译性、互动性和面向对象的脚本语言。优点:开源、免费、简单、易学、可移植、可扩展、易维护、开发效率高。缺点:运行速度慢、代码不能加密。Python是如何被解释的?Python是一种解释性语言,它的源代码可以直接运行。Python解释器会将源代码转换成中间语言,之后再翻译…

    2022年10月7日
    5
  • 婴儿照片大全可爱萌萌_好萌图片

    婴儿照片大全可爱萌萌_好萌图片萌翻了!这是一组可爱的婴儿照片,你可以从中学习到优秀的婴儿照片拍摄技术。就像我以前说的,婴儿总是持续在运动,因此很难找到一个好的角度。拍摄的时候,试着和婴儿保持同一水平,使用长de焦距。特别在最初几

    2022年8月4日
    13
  • html分页样式居中,bootstrap分页样式怎么实现?

    html分页样式居中,bootstrap分页样式怎么实现?bootstrap分页样式怎么实现?下面本篇文章给大家介绍一下bootstrap分页的实现。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。任何一个网页里面,我们都可以看到分页,不管是移动端,还是pc端,不管是下拉到下一页,还是按钮下一页,都需要分页支撑你的网站。这样首先,可以提高你的网站的访问效率;另外页面展现也更加好看,要不然,上百万的上千万的数据;显示估计一两个小时也显示不出…

    2022年7月17日
    14
  • 李雅普诺夫(第二方法)稳定性分析+例题

    李雅普诺夫(第二方法)稳定性分析+例题基于田玉平等 自动控制原理 依据学习经验重述 内容 1 背景和思路 2 李雅普诺夫第二方法 3 李雅普诺夫稳定性分析 4 例题

    2026年3月19日
    1
  • java dom4j读取xml_java dom4j解析xml用到的几个方法

    java dom4j读取xml_java dom4j解析xml用到的几个方法搜索热词1.读取并解析XML文档:SAXReaderreader=newSAXReader();Documentdocument=reader.read(newFile(fileName));reader的read方法是重载的,可以从InputStream,File,Url等多种不同的源来读取。得到的Document对象就带表了整个XML。读取的字符编码是按照XML文件头定义的编…

    2022年7月26日
    10
  • SpringBoot 中使用HikariPool 报错Possibly consider using a shorter maxLifetime value.

    SpringBoot 中使用HikariPool 报错Possibly consider using a shorter maxLifetime value.SpringBoot使用HikariPool遇到:HikariPool-1-Failedtovalidateconnectioncom.mysql.jdbc.JDBC4Connection@4933c203(Nooperationsallowedafterconnectionclosed.).PossiblyconsiderusingashortermaxLifetimevalue.错误还是比较明显了就是maxLifetime这个参数配置不合理HikariP

    2022年6月23日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号