读改善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、付费专栏及课程。

余额充值