欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

焦虑的程序员--关于final

程序员文章站 2022-07-12 18:49:14
...
Zzzz
/**
	 * 
	 * 使用final修饰变量是为了强调在调用该变量的上下文中,该变量是保证不变的,
	 * 
	 * 场景:需要将一个同步执行的上下文拆分成分阶段异步执行的上下文,
	 * 保证上下文环境的“等效”是必要的,做到即使出现“刻舟求剑”的情况,
         * 也不是由于上下文的异步拆分引起的。
	 * 
	 * 上下文的等效的判定:
	 * 		1:	外部引用的资源等效,设置具有final语义是保证等效的“
         *                      必要但不充分条件”,
	 * 			因为在上下文中引用资源的状态还是可能会有其他形式的改变,
         *                      而这种改变是否会对“异步改造”的产生影响,
	 * 			需要在“上下文运行流程等效”上进行分析。
	 * 		2:	上下文运行流程等效
	 * 
	 * 
	 * Tip: 分析一个问题的时候,会有一下关系存在,
         *        判断“场景A 是 场景B 的问题”这个关系是否成立。
	 * 		判断这个关系是否成立的过程应该分为两步:
	 * 			1.	“就当下系统事实情况”,判断场景A是否和场景B“独立”,
         *                             “独立”的判断可以有很多标准,
	 * 				可以是统计上表现的,也可以是逻辑上的相互制约等
	 * 				如果是独立的,则问题的关系不成立,
         *                              也就是不应该在场景B的改造中考虑场景A
	 * 			2.	如果相互不独立,则需要具体情况具体分析了。
	 * 		之所以要求有步骤一,是因为在现实中有太多的“伪问题”存在,
         *             将两个本来相互独立的现象硬放在一起,
	 * 		说是一个问题,非常具有迷惑性。而且是诡辩中经常使用的伎俩,
         *制造“伪问题”:
	 * 		注意“就当下系统的实际情况”的前提,
         *             之所以有这个前提是因为我们必须从实际情况出发,
	 * 		因为如果没有这个前提,那么在一个假设的情况中,
         *             将两个独立的事情搅和修改成非独立的,是一件很容易的事情。
	 * 		如果这种辩解出现了,首先要提醒的是,这种假设的场景是否是事实,
         *             如果不是,问是否觉得这种假设很有道理,
	 * 		让大家很happy,
         *              以及是否非要在当前的场景比较中强加进来是否是合适的时机。
	 *
	 *
	 * 实战:
	 * 问题:	可能有人会问,即便是引用的变量被设置成了final了但是对象实例还是无法保证不变啊?
	 * 回答: 这确实是一个事实场景,但是即使不做异步改造(也就是在同步的上下文下),这个场景同样可能会发生。
	 * 		此时应判断“即便是引用的变量被设置成了final,但是对象实例还是无法保证不变”场景同“上下文的异步改造”场景
	 * 		是否是独立的,如果是独立的,就没有必要在异步上下文改造的过程中考虑他。
	 * 		
	 * 		也许更好的提问方式是“对final的对象的内部改变进行控制”场景同“上下文的异步改造”场景是否独立,
	 * 		此时的回答是: 	不是独立的,“对final的对象的内部改变进行控制”场景 是 “上下文的异步改造”场景 的问题 
	 * 					关系成立,因为控制策略会因为同异步的不同而改变。这也是我们在改造中应当特别注意的。
	 * 					并且有些控制场景在异步改造的过程中会异常困难,此时可能会发现,
	 * 					资源本身都必须建立针对某种操作的版本控制机制。
	 * 					由以上分析可以看出,设置final的根本价值在于缩小了考虑问题的范围。确立了分析问题的步骤:
	 * 					1,界定具有final语义的资源
	 * 					2,结合1中资源的状态变迁,分析上下文运行流程等效性,给出具体方案
	 * 					值得一提的是,在异步的环境中,即使我们可能很难要求资源不发生状态变化(
	 * 					就像false share现象),也应该思考下,在这个不可测的变化中,
	 * 					所真正关心的那部分信息变化了么?如果没有,那世界依旧还是美好的。
	 * 
	 * 删了可惜的注释,存在blog里吧
	 */
	private final ServiceInstanceKeeper serviceInstanceKeeper = new ServiceInstanceKeeper();