15.break万万不可忘
16.易变业务使用脚本语言编写
(脚本语言是一种解释型语言,不需要编译成二进制代码,也不需要像java一样生成字节码,它的执行是依靠解释器解释的,在此在运行期变更代码非常容易,而且不需要停止应用)
//model.js
function formula(var1,var2){
return var1+var2*factor;
}
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包发布才是万全之策
9万+

被折叠的 条评论
为什么被折叠?



