`
song020cn
  • 浏览: 61887 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于《Java解惑》“谜题52:合计数的玩笑”的引申讨论

    博客分类:
  • Java
阅读更多
	static final class StaticCheck {
		static {
			getValue();
		}
		
		private static int value;

		public StaticCheck() {
			super();
			System.out.println("check value:" + getValue());
		}
		
		private static boolean isInit = false;
		
		private static int getValue() {
			if (isInit) {
				return value;
			}
			for (int i = 0; i < 100; i++) {
				value += i;
			}
			return value;
		}
	}

main方法:

	public static void main(String...args) {
		new StaticCheck();
	}

  

这是跟书中原意相同的代码。结果呢,不用说,大家也就猜到了。

就是getValue方法执行了两遍。

 

但是,我做了一点小小的改动,结果好像又对了。

	static final class StaticCheck {
		static {
			getValue();
		}
		
		private static int value = 0;

		public StaticCheck() {
			super();
			System.out.println("check value:" + getValue());
		}
		
		private static boolean isInit = false;
		
		private static int getValue() {
			if (isInit) {
				return value;
			}
			for (int i = 0; i < 100; i++) {
				value += i;
			}
			return value;
		}
	}

 差异在这里:

private static int value = 0;

 

我又重新给value赋值了。

所以,虽然getValue执行了两遍,但是由于value、isInit这两个变量,在第二次执行之前,都重新初始化了。所以,结果又对了。

 

如果,要说问题的隐蔽性的话,个人认为后一种更难发现,因为它的执行结果是符合预期的。但是,如果哪天有人对代码进行了小小的修改。

例如:

		private static int value = 0;
		
		static {
			getValue();
		}

 那可就惨了!!!

 

0
2
分享到:
评论

相关推荐

    Java解惑(谜题)CHM中英文双版本

    谜题52:合计数的玩笑 谜题53:按你的意愿行事 谜题54:Null与Void 谜题55:特创论 Java谜题6——库谜题 谜题56:大问题 谜题57:名字里有什么? 谜题58:产生它的散列码 谜题59:什么是差? 谜题60:一行...

    java解惑 书pdf精简版

    本系列内容来源于《JAVA解惑》一书,不是本人所独创,此系列内容应该说是该书的一个精简版,但内容含盖90%左右,本人看完之后是大有收获! 第1章 绪论 第2章 表达式之谜 谜题1:奇数性 谜题2:找零时刻 谜题3:长...

    Java解惑[高清].pdf

    谜题52:总和的玩笑 .119 谜题53:做你的事吧 .123 谜题54:Null与Void .125 谜题55:特创论 127 第7 章库之谜 131 谜题56:大问题 131 谜题57:名字里有什么 133 谜题58:产生它的散列码 137 谜题59:差是...

    java解惑 java 表达式谜题 java 字符谜题 java 循环谜题 java 异常谜题

    java 表达式谜题 java 字符谜题 java 循环谜题 java 异常谜题 java 高级谜题 ......

    java解惑java解惑java解惑

    java解惑java解惑java解惑java解惑java解惑java解惑

    Java解惑/Java谜题(CHM)

    我整理出来的Java解惑/谜题的CHM版本,包括目录、全文搜索和收藏夹。比目前Word/PDF版本的多个目录,比TXT版本的多一些格式。-- 如果不能打开CHM,请按下面方法解决:-- 右键点击chm文档,查看属性,可以看到...

    Java解惑Java解惑

    Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑

    java解惑(java谜题)中文版的

    java解惑(java谜题)中文版的. 值得一看的JAVA资料. Java puzzlers

    JAVA解惑(JAVA谜题) 中文版(PDF)

    Java解惑,是一本以大量java实例,讲述如何在程序中避免程序缺陷和程序陷阱的,解惑的过程中,介绍了一些Java编程语言中许多不易被掌握的知识点,其阅读价值非常高,适合具有Java知识的学习者和有编程经验的Java...

    java解惑 书籍类 谜题

    java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑 java 解惑

    JAVA解惑.pdf

    Java 谜题 谜题 20:我的类是什么? 下面的程序被设计用来打印它的类文件的名称。如果你不熟悉类字面常量,那么 我告诉你 Me.class.getName()将返回 Me 类完整的名称,即 “com.javapuzzlers.Me”。那么,这个程序...

    Java解惑.pdf

    Java解惑.pdf Java解惑.pdf Java解惑.pdf Java解惑.pdf

    java谜题解惑 中文chm

    在每个谜题之后都有详细的解惑方案,这些方案在给出那些实际行为与表面上迥异的程序行为的简单解释的同时,更向读者展示了如何一劳永逸地避免底层的陷阱与缺陷。 本书以轻松诙谐的语言,寓教于乐的方式,由浅入深、...

    Java解惑 中文版

    Java解惑中文版 Java解惑 java健壮程序

    Java 谜题解惑

    Java 谜题解惑。如:奇数性、找零时刻、长整除、十六进制等相关疑惑。

    Java Puzzlers 中文版(Java解惑)

    Java Puzzlers 中文版(Java解惑) Java 谜题 1——表达式谜题 谜题 1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数。这个方法能够正确运转 吗? public static boolean isOdd(int i){ return i % 2 == 1...

    Java PUZZLE Java 解惑

    Java PUZZLE Java 解惑 Java PUZZLE Java 解惑 Java PUZZLE Java 解惑Java PUZZLE Java 解惑 Java PUZZLE Java 解惑 Java PUZZLE Java 解惑

    JAVA 解惑 java经典

    JAVA解惑,你面包括一些java经典的问题。

    Java解惑(中文版)_java_java解惑_solve65p_

    与java相关的的学习,适合初学者,可以看看

Global site tag (gtag.js) - Google Analytics