??xml version="1.0" encoding="utf-8" standalone="yes"?>
。存在未使用的私有静态字D?span lang="EN-US">
。带有不必要的修饰符的借口
。目前没有用的U有字段
。未使用的变?span lang="EN-US">
。无需的参?span lang="EN-US">
。显C导入的java.lang?span lang="EN-US">
。目前没有用的U有Ҏ
2
、编码标?span lang="EN-US">
。一行语句中声明了多U类型的变量
。物理位|不在一L同名组成员 ?span lang="EN-US">
。从一个抽象类库中的构造器调用的抽象方?span lang="EN-US">
。包括大?span lang="EN-US">case语句?span lang="EN-US">switch语句
。除了第一个之外的mainQ)函数
。直接弹出的Exceptioncd
?span lang="EN-US">catch语句?span lang="EN-US">Exception或?span lang="EN-US">RuntimeException
。直接弹出的Error
。没有在接口中定义的帔R
。长整数应该使用‘L?/span>代替写字母‘l?
3
、初始化
。没有显式初始化的静态字D?span lang="EN-US">
。没有显式初始化每个数据成员的构造器
。编译代码中可能的漏z?span lang="EN-US">
。存在错误的case?span lang="EN-US">switch语句
。程序体为空?span lang="EN-US">for语句
。程序体为空?span lang="EN-US">if语句
。需要重载的Ҏ
。应该用等号代?span lang="EN-US">==
。程序体为空?span lang="EN-US">else语句
。强制{换ؓ较低_ֺ的主要数据类?span lang="EN-US">
。在switch子句中的文本标识
?span lang="EN-US">if条g中的变量赋?span lang="EN-US">
。缺?span lang="EN-US">default子句中的switch语句
。存在嵌套赋?span lang="EN-US">
。比较QҎ
。@环控制变量在循环内部被突然改?span lang="EN-US">
。方法参数名U和cL员名U冲H?span lang="EN-US">
。可能与字符串串联淆的+操作W?span lang="EN-US">
4
、面向对象编E?span lang="EN-US">
。承的静态成员函数被隐藏
。可能嵌套过qcd
。承的实例变量被隐?span lang="EN-US">
。被重蝲privateҎ
。内部的cd不可见或外部的类库不相关
。某个实列变量ؓpublic或在package?span lang="EN-US">
。没有在一开始列出的public?span lang="EN-US">packageҎ和数?span lang="EN-US">
。不?span lang="EN-US">abstract或实现比较通常的接?span lang="EN-US">
。命名惯?span lang="EN-US">
。一个类名称不符合标?span lang="EN-US">
。一个接口名UCW合标准
。一个列外名UCW合标准
。一U方法名UCW合标准
。一个静态字D名UCW合标准
。一个静态方法名UCW合标准
。一U方法参数名UCW合标准
。一个实列字D不W合标准
。一个本地变量名UCW合标准
。一个最l静态字D中包含写字母
。一个返回布值的Ҏ使用"is"或?span lang="EN-US">"has"前缀
。一个接口成员字D包含小写字?span lang="EN-US">
。用一个非惯例的变量名U?span lang="EN-US">
5
、优?span lang="EN-US">
。一?span lang="EN-US">finally模块中存在未关闭的流
。用一?span lang="EN-US">for循环代替System.arrarycopy()拯数组
。存在没有必要的instanceof
。存在没有必要的强制变量cd转换
。可以用一个羃写的赋D?span lang="EN-US">
。常量字W串使用StringBuffer代替String
。@环条件过于复?span lang="EN-US">
。取反操作符使用q于频繁
6
、回?span lang="EN-US">
?span lang="EN-US">finalize()没有调用super.finally()
。最l方法的最后模块没有调?span lang="EN-US">super.finalize()
?span lang="EN-US">finalize()被显C?span lang="EN-US">
。在主要类型{换成StringӞ使用了不必要的时变?span lang="EN-US">
。在应该使用long[]的位|用了Date[]
7
?span lang="EN-US">javadoc注释
。误用了Javadoc标签
?span lang="EN-US">Javadoc和普通注释之间区分不明显
8
、线E?span lang="EN-US">
。?span lang="EN-US">synchronizedQ降低了性能
9
、全局静态分?span lang="EN-US">
。过度访?span lang="EN-US">package-private字段
。过度访?span lang="EN-US">package-privateҎ
。过度访?span lang="EN-US">package-privatecd
。过度访?span lang="EN-US">public/protected字段
。过度访?span lang="EN-US">public/protectedҎ
。过度访?span lang="EN-US">public/protectedcd
。没有用全局package-private字段
。没有用全局package-privateҎ
。没有用全局package-privatecd
。没有用全局public/protected字段
。没有用全局public/protectedҎ
。没有用全局public/protectedcd
10
、企业版java beans(EJB)
?span lang="EN-US">beancd没有定义成ؓpublic
?span lang="EN-US">beancd被错误定义成?span lang="EN-US">abstract
?span lang="EN-US">beancd被错误定义成?span lang="EN-US">final
?span lang="EN-US">beancd实现一?span lang="EN-US">ejbCreate()Ҏ
?span lang="EN-US">beancd错误定义finalizeҎ
?span lang="EN-US">ejbCreate()讉K控制W没有定义成?span lang="EN-US">public
?span lang="EN-US">SessionBean中的ejbCreate()没有q回void
。定位方法的修饰W没有定义成?span lang="EN-US">public
。定位方法的q回cd不是一个主键,也不是主键的c集
?span lang="EN-US">ejbPostCreate()有一个非public的访问控制修饰符
?span lang="EN-US">ejbPostCreate()没有q回cdvoid
11
、杂?span lang="EN-US">
。成员字D隐藏在成员Ҏ?span lang="EN-US">
。@环记数器无法递增
?span lang="EN-US">for循环中没有包含布条?span lang="EN-US">
。存在的clone()Ҏ没有调用super.clone()
?span lang="EN-US">for语句~少代码模块
问题如下Q?span lang="EN-US">
//
分析q段E序Qƈ解释一下,着重讲?span lang="EN-US">synchronized?span lang="EN-US">wait(),notify 谢谢Q?span lang="EN-US">
class ThreadA
{
public static void main(String[] args)
{
ThreadB b=new ThreadB();
b.start();
System.out.println("b is start....");
synchronized(b)//括号里的b是什么意?span lang="EN-US">,起什么作?span lang="EN-US">?
{
try
{
System.out.println("Waiting for b to complete...");
b.wait();//q一句是什么意思,I竟让谁wait?
System.out.println("Completed.Now back to main thread");
}catch (InterruptedException e){}
}
System.out.println("Total is :"+b.total);
}
}
class ThreadB extends Thread
{
int total;
public void run()
{
synchronized(this)
{
System.out.println("ThreadB is running..");
for (int i=0;i<100;i++ )
{
total +=i;
System.out.println("total is "+total);
}
notify();
}
}
}
要分析这个程?span lang="EN-US">,首先要理?span lang="EN-US">notify()?span lang="EN-US">wait(),Z么在前几天纪录线E的时候没有纪录这两个Ҏ?span lang="EN-US">,因ؓq两个方法本来就不属?span lang="EN-US">Threadc?span lang="EN-US">,而是属于最底层?span lang="EN-US">object基础cȝ,也就是说不光?span lang="EN-US">ThreadQ每个对象都?span lang="EN-US">notify?span lang="EN-US">wait的功能,Z么?因ؓ他们是用来操U锁?span lang="EN-US">,而每个对象都有锁,锁是每个对象的基,既然锁是基础?span lang="EN-US">,那么操纵锁的Ҏ当然也是最基础?span lang="EN-US">.
再往下看之前?span lang="EN-US">,首先最好复习一?span lang="EN-US">Think in Java??xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /?>
按照Think in Java中的解释:"wait()允许我们线E置入“睡眠”状态,同时又“积极”地{待条g发生改变.而且只有在一?span lang="EN-US">notify()?span lang="EN-US">notifyAll()发生变化的时候,U程才会被唤醒,q检查条件是否有?span lang="EN-US">."
我们来解释一下这句话.
"wait()允许我们线E置入“睡眠”状?span lang="EN-US">",也就是说,wait也是让当前线E阻塞的,q一点和sleep或?span lang="EN-US">suspend是相同的.那和sleep,suspend有什么区别呢?
区别在于"(wait)同时又“积极”地{待条g发生改变",q一点很关键,sleep?span lang="EN-US">suspend无法做到.因ؓ我们有时候需要通过同步Q?span lang="EN-US">synchronizedQ的帮助来防止线E之间的冲突Q而一旦用同?span lang="EN-US">,p锁定对象Q也是获取对象?span lang="EN-US">,其它要用该对象锁的U程都只能排队等着,{到同步Ҏ或者同步块里的E序全部q行完才有机?span lang="EN-US">.在同步方法和同步块中,无论sleep()q是suspend()都不可能自己被调用的时候解除锁?span lang="EN-US">,他们都霸占着正在使用的对象锁不放.
?span lang="EN-US">wait却可?span lang="EN-US">,它可以让同步Ҏ或者同步块暂时攑ּ对象?span lang="EN-US">,而将它暂时让l其它需要对象锁的h(q里应该是程序块,或线E?span lang="EN-US">)?span lang="EN-US">,q意味着可在执行wait()期间调用U程对象中的其他同步Ҏ!在其它情况下(sleep?span lang="EN-US">,suspend?span lang="EN-US">),q是不可能的.
但是注意我前面说?span lang="EN-US">,只是暂时攑ּ对象?span lang="EN-US">,暂时l其它线E?span lang="EN-US">,?span lang="EN-US">wait所在的U程q是要把q个对象锁收回来的呀.wait什?span lang="EN-US">?是wait别h用完了还l我啊!
?span lang="EN-US">,那怎么把对象锁收回来呢?
W一U方?span lang="EN-US">,限定借出ȝ旉.?span lang="EN-US">wait()中设|参?span lang="EN-US">,比如wait(1000),以毫Uؓ单位,p明我只借出?span lang="EN-US">1U中,一U钟之后,我自动收?span lang="EN-US">.
W二U方?span lang="EN-US">,让借出ȝ人通知?span lang="EN-US">,他用完了,要还l我?span lang="EN-US">.q时,我马上就收回?span lang="EN-US">.?span lang="EN-US">,假如我设?span lang="EN-US">1时之后收回,别h只用了半时完?span lang="EN-US">,那怎么办呢??span lang="EN-US">!当然用完了就收回?span lang="EN-US">,q管我设的是多长旉?span lang="EN-US">.
那么别h怎么通知我呢?怿大家都可以想C,notify(),q就是最后一句话"而且只有在一?span lang="EN-US">notify()?span lang="EN-US">notifyAll()发生变化的时候,U程才会被唤?span lang="EN-US">"的意思了.
因此,我们可将一?span lang="EN-US">wait()?span lang="EN-US">notify()|入M同步Ҏ或同步块内部Q无论在那个c里是否准备q行涉及U程的处理。而且实际?span lang="EN-US">,我们也只能在同步Ҏ或者同步块里面调用wait()?span lang="EN-US">notify().
q个时候我们来解释上面的程?span lang="EN-US">,直是易如反掌?span lang="EN-US">.
q接?/strong> 例如Q如果您使用 Java servletQJava servlet 通过 init() Ҏ创徏q在其生命周期结束时被销毁(通过 destroy() ҎQ)的方式,您是虽然避免了每?servlet 被实例化旉新徏立连接。这样一U方式会明显地降低应用程序的性能。完成相同功能的更好的途径是用“连接池QConnection PoolQ”,您可以在q接池中初始化多个连接(q且参数可以?XML 配置文g中读取)?/p> q接本n׃l集合对象和一个在整个hq程中ɘq接保持打开的用戯求组成。创接池的关键是在数据库讉K代码中用如下一些块Qtry{}.. catch{}... finally{}..。然后您使用 close() Ҏ来确认连接确实被q回Cq接池而不是被d关闭了。在“finally{}”块中指?close() Ҏ使得执行q程中发生的异常会被捕获刎ͼq且该语句仍被执??q接q回到连接池Q这防止了应用E序中“连接泄漏(connection leakQ”的发生?/p> 以下是构Z?JDBC q接的示例: Connection con = null; 使用 PreparedStatement 另一个额外的优势是由驱动E序完成的对用户传递给语句的字W串的自动{义。D例来_q意味着当您试图字W串“D'Marco”插入到一个基于字W的数据域(它可能是 VARCHAR, VARCHAR2, CHAR {)中时QSQL 语句不会在遇到第一个撇h׃生灾难性的p|?/p> 使用 PreparedStatement 对象时的另一个良好习惯是调用对象自n?close() Ҏ来“关闭对象”,q个Ҏ被用来q行 SQL 语句。这会关闭Q何与正在执行?SQL 语句相关联的游标Q这样就能防止打开的游标把数据库弄得十分凌乱?/p> 以下是一个创?PreparedSatement 的示例: PreparedStatement sqlstmt = dbCon.prepareStatement("select * 恰当地利用事?br /> 在更新动态数据库表和数据时常怼遗忘的一个方面,是在向过一个表CZ个逻辑事务的表更新或插入数据时Q这个事务应该反映到所有的表中Q或者在到事务p|Ӟ通过“回滚”该事务而在每一个表中都没有反映?/p> 一些核心的 JDBC 包支持了四种事务隔离模式Qtransaction isolation modeQ,q些模式允许E序指定它们想事务表现出怎样的行为。大多数E序都至支持两U模式:“读取提交(read committedQ”(~省|和“可序列化的QserializableQ”。当不可重复d应该允许在多个查询之间由一个事务作出的修改对于另一个事务可见时Q请使用“读取提交”;要由另一个事务作出的修改在一个查询运行时成ؓ可见的,请用象读取(phantom readQ。当您需要一个跨多个操作前后完全一致的数据库视图时Q就应该使用更ؓ严格的“可序列化的”设|。把q接的自动提交设|ؓ“假”(autocommit = "false"Q,Cq一Ҏ很有用的?/p> 以下是构Z个连接ƈ讄其各个属性参数的CZQ?/p> Connection con = null; pConn.setTransactionIsolation( 您也可以利用一个可选的 JDBC ??JTAQJava Transaction APIQ,它允许容易地和完全独立的事务服务器进行集成?/p>
M应用E序都必d讉Kzd的数据库q接Q然后才能访问数据库。数据库q接是一个很占资源且 I/O 开销很大的操作,q且如果每次想用数据库q接旉必须创徏它,那么它将会成为您的性能瓉?/p>
try { ds = (DataSource)myContext.lookup("<specify JDBC driver>");
pooledCon = ds.getConnection("scott", "tiger");
// Processing Code goes here
} catch (Exception ignored) {
// catch JNDI or JDBC exceptions here
} finally {
if(pooledCon != null)
pooledCon.close();
}
Z认ؓ PreparedStatement 对象的效率比多个 Statement 对象更高Q尤其是如果您必dơ执行同一条语句而差别仅在于参数不同时更是如此。PreparedStatement 允许您将 SQL 语句“编译”一ơ(管q种~译W一ơ要消耗较多的旉Q,然后它保存在高速缓存中Q从而实现有效的重用。同时它也提供了可读性更好的代码?/p>
from table1 where field_1=?");
sqlstmt.setInt(1, 12);
ResultSet rs = sqlstmt.executeQuery();
// close the resultset statement to avoid hanging cursors in database
sqlstmt.close();
// processing of new statement
sqlstmt = dbCon.prepareStatement("select * from table2 where field_2 = ?");
// repeat creating the result set
try {
dtsr = (DataSource <the JDBC driver you use>");
pConn = dtsr.getConnection("<specify login>", "<specify password>");
pConn.setAutoCommit(false); // transaction are not committed uponm execution
Connection.TRANSACTION_SERIALIZABLE);
// pConn is pooled connection
pConn.commit();
} catch (Exception ignored) {
try { pConnn.rollback(); } catch (SQLException esgl) {}
} finally {
if(pConn != null) {
pConn.setAutoCommit(true); //reset autocommit
pConn.close();
}
}