读改善java程序的151个建议(2)

15.break万万不可忘

16.易变业务使用脚本语言编写
(脚本语言是一种解释型语言,不需要编译成二进制代码,也不需要像java一样生成字节码,它的执行是依靠解释器解释的,在此在运行期变更代码非常容易,而且不需要停止应用)
//model.js
function formula(var1,var2){
return var1+var2*factor;
}

//client.java
         public   static  void   main (  String []  args ) {

                // TODO Auto-generated method stub
                //获得一个 Js的执行引擎
                ScriptEngine  engine= new  ScriptEngineManager  (). getEngineByName  ( "javascript"  );
                //建立上下文变量
                Bindings  bind=engine.createBindings();
              bind.put(  "factor"  , 1);
                //绑定上下文,作用域是当前引擎范围
              engine.setBindings(bind,  ScriptContext  .ENGINE_SCOPE);
                Scanner  inputScanner=  new   Scanner (  System .in);
                while  (inputScanner. hasNextInt  ()) {
                       int  first=inputScanner. nextInt  ();
                       int  sec=inputScanner. nextInt  ();
                       System  .out. println  ( "your input params are:"  +first+ ","  +sec);
                       try  {
                             //执行js 代码
                           engine.eval(  new   FileReader  ( "c:/model.js"  ));
                     }  catch  ( FileNotFoundException  e) {
                           
                             // TODO Auto-generated catch block
                           e.  printStackTrace  ();
                           
                     }  catch  ( ScriptException  e) {
                           
                             // TODO Auto-generated catch block
                           e.  printStackTrace  ();
                           
                     }
                       //是否可调用方法
                       if (engine  instanceof   Invocable  ){
                             Invocable  in=(  Invocable )engine;
                             Double  result;
                             try  {
                                    //执行js 中的函数
                                  result = (  Double  )in.invokeFunction( "formula"  , first,sec);
                                    System  .out. println  ( "calc result:" +result.  intValue ());
                           }  catch  ( ScriptException  e) {
                                  
                                    // TODO Auto-generated catch block
                                  e.  printStackTrace  ();
                                  
                           }  catch  ( NoSuchMethodException  e) {
                                  
                                    // TODO Auto-generated catch block
                                  e.  printStackTrace  ();
                                  
                           }
                           
                     }
                     
              }

17.慎用动态编译
注意以下几点:
(1)在框架中谨慎使用
(2)不要在要求高性能的项目使用
(3)动态编译要考虑安全问题
(4)记录动态编译过程

18.避免instanceof非预期结果
instanceof 是一个简单的二元操作符,它是用来判断一个对象是否是一个类实例的,其操作类似于>=、==
注意:
只要instanceof 关键字的左右两个操作数有继承或实现关系,就可以编译通过,具体返回true还是false就必须看二者的继承或实现关系;
instanceof 只能用于对象的判断,不能用于基本类型的判断,例:'A' instanceof Character 这种编译不通过,因为'A'是一个char类型 (基本类型);
若左操作数是null,结果就直接返回false;

19.断言绝对不是鸡肋
两个特性:(1)assert默认是不开启的 (2)assert抛出的异常Assertion Error是继承自Error
assert虽然是做断言的,但不能将其等价于if...else...这样的条件判断,它在以下两种情况不可使用:
(1)在对外公开的方法中 (2)在执行逻辑代码的情况下
那在什么情况下能够使用assert呢?一句话:按照正常执行逻辑不可能到达的代码区域可以放置 assert.具体分为三种情况:
(1)在私有方法中放置assert作为输入参数的校验
(2)流和控制中不可能达到的区域
(3)建立程序探针

20.不要只替换一个类
主要是针对常量接口
对于final修饰的的基本类型和String类型,编译器会义为它是稳定态(Immutable Status),所以在编译时就直接编译到字节码中了,避免了在运行期引用(Run-time Reference),以提高代码的执行效率。
而对于final修饰的类(即非基本类型),编译器认为它是不稳定态(Mutable Status),在编译时建立的则是引用关系(该类型也叫做Soft Final),如果Client类引入的常量是一个类或实例,即使不重新编译也会输出最新值。
注意:发布应用时禁止使用类文件替换方式,整体war包发布才是万全之策


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值