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包发布才是万全之策