日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

01-第一章 Java开发中通用的方法和准则

發(fā)布時(shí)間:2025/3/15 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 01-第一章 Java开发中通用的方法和准则 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

建議1:不用在常量和變量中出現(xiàn)易混淆的字母

? ? ?包括名全小寫,類名首字母全大寫,常量全部大寫并用下劃線分割,變量采用駝峰命名法(Camel Case)命名等。

? ? ?例如:

package?com.company;

/**

* 數(shù)字后跟小寫字母l的問題

*/

public class Client {

?????public static void main(String[] args) {

??????????long i = 1l;

??????????System.out.println("i的兩倍是:" + (i+i));

?????}

}

? ? ?句中定義一個(gè)長(zhǎng)整型變量1,但后面的字母‘l’標(biāo)識(shí)符在很多字體中都非常類似數(shù)字‘1’,所以很容易誤以為變量i的值為十一。

? ? ?因此,如果字母和數(shù)字必須混合使用,字母‘l’務(wù)必大寫,字母‘o’則增加注釋。

建議2:莫讓常量蛻變成變量

package?com.company;

import java.util.Random;

/**

* 莫讓常量變成變量

*/

public class Client {????

?????public static void main(String[] args) {

??????????System.out.println("常量會(huì)變哦:" + Const.RAND_CONST);

?????}

}

/*接口常量*/

interface Const{

?????//這還是常量嗎?

?????public static final int RAND_CONST = new Random().nextInt();

}

? ? ?語句中雖然想要定義一個(gè)常量,但卻賦值了一個(gè)不確定的值,這樣使得程序可讀性非常差。

? ? ?常量就是常量,在編譯期必須確定。

建議3:三元操作符的類型務(wù)必一致

package?com.company;

/**

* 三元操作符兩個(gè)操作數(shù)的類型必須一致

*/

public class Client {

?????public static void main(String[] args) {

??????????int i = 80;

??????????String s = String.valueOf(i<100?90:100);

??????????String s1 = String.valueOf(i<100?90:100.0);

??????????System.out.println("兩者是否相等:"+s.equals(s1));

?????}

}

? ? ?運(yùn)行結(jié)果:兩者是否相等:false

? ? ?分析:

? ? ? ? ? 三元操作符必須要返回一個(gè)數(shù)據(jù),而且類型確定,不可能條件為真時(shí)返回int類型,條件為假時(shí)返回float類型,編譯器是不允許如此的,所以它會(huì)進(jìn)行類型轉(zhuǎn)換。

? ? ?三元操作符類型轉(zhuǎn)換規(guī)則:

? ? ?a、如果兩個(gè)操作數(shù)不可轉(zhuǎn)換,則不做轉(zhuǎn)換,返回值為Object類型。

? ? ?b、若兩個(gè)操作數(shù)是明確類型的表達(dá)式(比如變量),則按照正常的二進(jìn)制數(shù)字來轉(zhuǎn)換,int類型轉(zhuǎn)換為long類型,long類型轉(zhuǎn)換為float類型等。

? ? ?c、若兩個(gè)操作數(shù)中有一個(gè)數(shù)字S,另一個(gè)是表達(dá)式,且其類型標(biāo)識(shí)為T,那么,若數(shù)字S在T的范圍內(nèi),則轉(zhuǎn)換為T類型;若S超出T類型的范圍,則T轉(zhuǎn)換為S類型。

? ? ?d、若兩個(gè)操作數(shù)都是直接量數(shù)字(Literal),則返回值類型為范圍較大者。

建議4:避免帶有變長(zhǎng)參數(shù)的方法重載

? ? ?為了提高方法的靈活度和可復(fù)用性,我們經(jīng)常要傳遞不確定數(shù)量的參數(shù)到方法中,在Java5之前常用的設(shè)計(jì)技巧就是把形參定義成Collection類型或其子類類型,或者是數(shù)組類型,這種方法的缺點(diǎn)就是需要對(duì)空參數(shù)進(jìn)行判斷和篩選,比如引入實(shí)參為null值和長(zhǎng)度為0的Collection或數(shù)組。而Java5引入變長(zhǎng)參數(shù)(varags)就是為了更好地提高方法復(fù)用性,讓方法調(diào)用者可以“隨心所欲”地傳遞是參數(shù)量,當(dāng)然變長(zhǎng)參數(shù)也是要遵循一定規(guī)則的,比如變長(zhǎng)參數(shù)必須是方法中的最后一個(gè)參數(shù);一個(gè)方法不能定義多個(gè)變長(zhǎng)參數(shù)等,這些規(guī)則要牢記,但是即使記住規(guī)則,往往還是會(huì)犯錯(cuò)。

package?com.company;

import java.text.NumberFormat;

/**

* 建議4:避免帶變長(zhǎng)參數(shù)的方法的重載

*/

public class Client {

?????//簡(jiǎn)單折扣計(jì)算

?????public void calPrice(int price,int discount){

??????????float knockdownPrice =price * discount / 100.0F;

??????????System.out.println("簡(jiǎn)單折扣后的價(jià)格是:"+formateCurrency(knockdownPrice));

?????}

?

?????//復(fù)雜多折扣計(jì)算

?????public void calPrice(int price,int... discounts){

??????????float knockdownPrice = price;

??????????for(int discount:discounts){

???????????????knockdownPrice = knockdownPrice * discount / 100;

??????????}

??????????System.out.println("復(fù)雜折扣后的價(jià)格是:" +formateCurrency(knockdownPrice));

?????}

?

?????//格式化成本地貨幣形式

?????private String formateCurrency(float price){

??????????return NumberFormat.getCurrencyInstance().format(price/100);

?????}

?

?????public static void main(String[] args) {

??????????Client client = new Client();

??????????//499元的貨物,打75折

??????????client.calPrice(49900, 75);

?????}

}????

?

上面程序中存在兩個(gè)重載的方法,程序執(zhí)行時(shí)選擇了第一個(gè)。

?????編譯器在選擇方法的時(shí)候會(huì)根據(jù)方法簽名(Method Signature)來確定調(diào)用哪個(gè)方法。然后根據(jù)實(shí)參的數(shù)量和類型確定調(diào)用哪個(gè)方法。編譯器之所以選擇兩個(gè)int型的實(shí)參而不是一個(gè)int型一個(gè)int數(shù)組的方法,是因?yàn)閕nt是一個(gè)原生數(shù)據(jù)類型,而且數(shù)組本身是一個(gè)對(duì)象,編譯器想要偷懶,所以會(huì)選擇簡(jiǎn)單的,只要符合編譯條件就通過。

變長(zhǎng)參數(shù)的方法可以使用,但要盡量避免重載,否則也會(huì)使程序的可讀性降低。

建議5:別讓null值和空值威脅到變長(zhǎng)方法

package?com.company.section1;

/**

* 帶有變長(zhǎng)參數(shù)的方法重載,在調(diào)用時(shí)失敗。

*

*/

public class Client {

?????public void methodA(String str,Integer... is){?????????

??????????System.out.println("Integer");

?????}

?

?????public void methodA(String str,String... strs){?????????

??????????System.out.println("String");

?????}

?

?????public static void main(String[] args) {

??????????Client client = new Client();

??????????client.methodA("China", 0);

??????????client.methodA("China", "People");

??????????client.methodA("China");

??????????client.methodA("China",null);

?????}

}

程序中client.methodA("China");和client.methodA("China",null);兩處編譯不通過,提示相同:方法模糊不清,編譯器不知道調(diào)用哪一個(gè)方法。

? ? ?該Client類違反了KISS原則(Keep it Simple, Stupid, 即懶人原則),按照此規(guī)則設(shè)計(jì)的方法應(yīng)該很容易調(diào)用。

對(duì)于client.methodA("China",null);方法,直接量null是沒有類型的,雖然兩個(gè)方法都符合調(diào)用請(qǐng)求,但不知道調(diào)用哪一個(gè),于是報(bào)錯(cuò)了。另外調(diào)用者最好不該隱藏實(shí)參類型,這樣的話不僅僅需要調(diào)用者猜測(cè)該調(diào)用哪個(gè)方法,而且被調(diào)用者也產(chǎn)生內(nèi)部邏輯混亂。應(yīng)該修改如下:

package?com.company.section2;

/**

* 帶有變長(zhǎng)參數(shù)的方法重載,在調(diào)用時(shí)失敗。

*

*/

public class Client {

?????public void methodA(String str,Integer... is){?????????

??????????System.out.println("Integer");

?????}

?

?????public void methodA(String str,String... strs){?????????

??????????System.out.println("String");

?????}

?

?????public static void main(String[] args) {

??????????Client client = new Client();

??????????String[] strs = null;

??????????client.methodA("China",strs);

?????}

}

建議6:重寫變長(zhǎng)方法也循規(guī)蹈矩

?????重寫必須滿足的條件:

?????1、重寫方法不能縮小訪問權(quán)限。

? ?? 2、參數(shù)列表必須與被重寫方法相同。

? ? ?3、返回類型必須與被重寫方法的相同或是其子類。

? ? ?4、重寫方法不能拋出新的異常,或者超出父類范圍的異常,但是可以拋出更少、更有限的異常,或者不拋出異常。

? ? ?參數(shù)列表相同指:參數(shù)數(shù)量相同、類型相同、順序相同

package?com.company;

/**

* 覆寫變長(zhǎng)方法也循規(guī)蹈矩

*/

public class Client {

?????public static void main(String[] args) {

??????????//向上轉(zhuǎn)型

??????????Base??base = new Sub();

??????????base.fun(100, 50);

??????????//不轉(zhuǎn)型

??????????Sub sub = new Sub();

??????????//sub.fun(100, 50);

?????}

}

//基類

class Base{

?????void fun(int price,int... discounts){

??????????System.out.println("Base……fun");

?????}????

}

//子類,覆寫父類方法

class Sub extends Base{

?????@Override

?????void fun(int price,int[] discounts){

??????????System.out.println("Sub……fun");

?????}

}

?????程序中子類調(diào)用方法的地方會(huì)編譯錯(cuò)誤,因?yàn)閕nt類型數(shù)組也是一種對(duì)象,編譯器并不會(huì)把int類型轉(zhuǎn)換為int類型數(shù)組。由于父類的方法是變長(zhǎng)參數(shù),所以會(huì)自動(dòng)轉(zhuǎn)換為int類型數(shù)組。

建議7:警惕自增的陷阱

package?com.company;

/**

* 警惕自增的陷阱

*

*/

public class Client {

?????public static void main(String[] args) {

??????????int count =0;

??????????for(int i=0;i<10;i++){

???????????????count=count++;

??????????}

??????????System.out.println("count="+count);

?????}

}

class Mock{

?????public static void main(String[] args) {

??????????int count =0;

??????????for(int i=0;i<10;i++){

???????????????count=mockAdd(count);

??????????}

??????????System.out.println("count="+count);

?????}

?????public static int mockAdd(int count){

??????????//先保存初始值

??????????int temp =count;

??????????//做自增操作

??????????count = count+1;

??????????//返回原始值

??????????return temp;

?????}

}

? ? ?Client的main函數(shù)中count的值依然是0。

count++是一個(gè)表達(dá)式,返回值是count自加前的值。即count=count++;就相當(dāng)于count=mockAdd(count);

若要修改這種問題只需把count=count++改為count++

這種情況PHP和Java的處理方式相同,但是C++中count=count++和count++是相同的。

建議8:不要讓就語法困擾你

package?com.company;

/**

* 不用讓舊語法困擾你

*

*/

public class Client {

????public static void main(String[] args) {

????????//數(shù)據(jù)定義及初始化

????????int fee=200;

????????//其他業(yè)務(wù)處理

????????saveDefault:save(fee);

????????//其他業(yè)務(wù)處理

????}

????static void saveDefault(){

}?

????static void save(int fee){

????}

}

語句saveDefault:save(fee);使用的語法是C語言中用到的標(biāo)號(hào),用于goto語句。

?????雖然Java拋棄了goto語法,但還是保留了該關(guān)鍵字,只是不進(jìn)行語義處理而已,與此類似的還有const關(guān)鍵字。

? ? ?Java雖然沒有g(shù)oto,但是擴(kuò)展了break和continue關(guān)鍵字,它們的后面都可以加上標(biāo)號(hào)做跳轉(zhuǎn),完全實(shí)現(xiàn)了goto功能,但同時(shí)也把goto的詬病帶了進(jìn)來。在閱讀大牛的開源程序時(shí),根本就看不到break或continue后跟標(biāo)號(hào)的情況,甚至break和continue都很少看到,這是提高代碼可讀性很好的一個(gè)方法,所以要盡量摒棄舊語法。

建議9:少用靜態(tài)導(dǎo)入

? ? ?從Java5開始引入了靜態(tài)導(dǎo)入語法(import static),其目的是為了減少字符輸入量,提高代碼的可閱讀性。

?????但是濫用靜態(tài)導(dǎo)入會(huì)使程序更難閱讀,更難維護(hù)。靜態(tài)導(dǎo)入后,代碼中就不用再寫類名了,但是我們知道類是"一些事物的描述",缺少了類名的修飾,靜態(tài)屬性和靜態(tài)方法的表象意義就可以被無限放大,這會(huì)讓閱讀者很難弄清楚其屬性或方法代表何意,甚至是哪個(gè)類的屬性(方法)都有思考一番。例如:

package com.company.section3;

import java.text.NumberFormat;

import static java.lang.Double.*;

import static java.lang.Math.*;

import static java.lang.Integer.*;

import static java.text.NumberFormat.*;

public class Client {

???? //輸入半徑和精度要求,計(jì)算面積

???? public static void main(String[] args) {

????????? double s = PI * parseDouble(args[0]);

????????? NumberFormat nf = getInstance();

????????? nf.setMaximumFractionDigits(parseInt(args[1]));?????????

????????? formatMessage(nf.format(s));

???? }

?

???? //格式化消息輸出

???? public static void formatMessage(String s){

????????? System.out.println("圓面積是:"+s);

???? }

}

程序中NumberFormat nf = getInstance();一句中的getInstance()讓人摸不著頭腦,不能直接鮮明的看到這個(gè)方法是哪個(gè)類的。

? ? ?所以對(duì)于靜態(tài)導(dǎo)入,一定要遵循兩個(gè)原則:

? ? ?》不使用*(星號(hào)通配符,除非是導(dǎo)入靜態(tài)常量類(只包含常量的類或接口))。

? ? ?》方法名是具有明確、清晰表象意義的工具類。

建議10:不要在本類中覆蓋靜態(tài)導(dǎo)入的變量和方法

? ? ?如果在本類中覆蓋了靜態(tài)導(dǎo)入的變量和方法,那么在調(diào)用的時(shí)候會(huì)調(diào)用本類中的變量和方法,這符合編譯器的“最短路徑”原則。

?????“最短路徑”原則:如果能夠在本類中查找到變量、常量、方法,就不會(huì)到其他包或父類、接口中查找,以確保本類中的屬性、方法優(yōu)先。

? ? ?因此,如果要變更一個(gè)被靜態(tài)導(dǎo)入的方法,最好的辦法是在原始類中重構(gòu),而不是在本類中覆蓋。

建議11:養(yǎng)成良好習(xí)慣,顯示聲明UID

? ? ?首先介紹一下序列化和反序列化:

? ? ?類實(shí)現(xiàn)Serializable接口的目的是為了可持久化,比如網(wǎng)絡(luò)傳輸和本地存儲(chǔ),為系統(tǒng)在分布和異構(gòu)部署提供先決條件。

? ? ?在序列化和反序列化的過程中,如果兩邊類版本不一致(例如增加了個(gè)屬性)。反序列化時(shí)就會(huì)報(bào)一個(gè)InvalidClassException異常。

? ? ?那么如何解決這種版本不一致的問題呢?

? ? ?SerialVersionUID,也叫作流標(biāo)識(shí)符(Stream Unique Identifier),即類的版本定義,它可以顯示聲明,也可以隱式聲明。顯示聲明格式如下:

? ? ?private static final long serialVersionUID = XXXXXL;

? ? ?隱式聲明由編譯器自動(dòng)通過包名、類名、繼承關(guān)系、非私有的方法和屬性,以及參數(shù)、返回值等組多因子計(jì)算得出的。(所以屬性改動(dòng)了,版本就不一致了)。

? ? ?但如果顯示聲明了serialVersionUID,JVM在反序列化時(shí)會(huì)根據(jù)serialVersionUID判斷版本,如果相同,則認(rèn)為類沒有發(fā)生改變,可以把數(shù)據(jù)流load為實(shí)例對(duì)象,如果不同,這會(huì)拋出InvalidClassException異常。

? ? ?如果顯示聲明了標(biāo)識(shí),但是兩個(gè)類卻不同(例如增加了屬性),則在反序列化中不會(huì)報(bào)錯(cuò),這提高了代碼的健壯性,但這種情況帶來的后果是反序列時(shí)無法反序列出現(xiàn)在的屬性,從而引起兩邊數(shù)據(jù)不一致。

? ? ?所以顯示聲明serialVersionUID可以避免對(duì)象不一致,但盡量不要以這種方式向JVM”撒謊“。

建議12:避免用序列化類在構(gòu)造函數(shù)為不變量賦值

? ? ?即final修飾的變量。

? ? ?因?yàn)榉葱蛄谢瘯r(shí)構(gòu)造函數(shù)不會(huì)執(zhí)行,如果在在構(gòu)造函數(shù)中為不變量賦值,反序列化時(shí)不會(huì)執(zhí)行構(gòu)造函數(shù),因此構(gòu)造函數(shù)對(duì)該變量做的操作就得不到,所以反序列化后該變量依然是老版本的值。

建議13:避免為final變量復(fù)雜賦值

? ? ?建議12中說的賦值中的值是指的簡(jiǎn)單對(duì)象。簡(jiǎn)單對(duì)象包括8個(gè)基本類型,以及數(shù)組、字符串(字符串情況很復(fù)雜,不通過new關(guān)鍵字生成String對(duì)象的情況下,final變量的賦值與基本類型相同),但是不能方法賦值。

? ? ?其中原理是這樣的,序列化時(shí)保存到磁盤上(或網(wǎng)絡(luò)傳輸)的對(duì)象文件包括兩部分:

? ? ?(1)類描述信息

? ? ? ? ? 包括包路徑、繼承關(guān)系、訪問權(quán)限、變量描述、變量訪問權(quán)限、方法簽名、返回值,以及變量的關(guān)聯(lián)類信息。要注意的一點(diǎn)是,它并不是class文件的翻版,它不記錄方法、構(gòu)造函數(shù)、static變量等的具體實(shí)現(xiàn)。之所以類描述會(huì)被保存,很簡(jiǎn)單,是因?yàn)槟苋ヒ材芑貋?#xff0c;這保證發(fā)序列化的健壯運(yùn)行。

? ? ?(2)非瞬態(tài)(transient關(guān)鍵字)和非靜態(tài)(static關(guān)鍵字)的實(shí)例變量值

? ? ? ? ? 當(dāng)值為基本類型時(shí),就被直接保存下來,如果是復(fù)雜對(duì)象,則該對(duì)象和關(guān)聯(lián)類信息一起保存,并且持續(xù)遞歸下去(關(guān)聯(lián)類也必須實(shí)現(xiàn)Serializable接口,否則出現(xiàn)序列化異常),也就是說遞歸后還是基本數(shù)據(jù)類的保存。

? ? ?正是因?yàn)檫@兩點(diǎn),一個(gè)持久化后的對(duì)象文件會(huì)比一個(gè)class文件大很多

? ? ?總結(jié)一下,反序列化時(shí)final變量在一下情況下不會(huì)被重新賦值:

? ? ?》通過構(gòu)造函數(shù)為final變量賦值。

? ? ?》通過方法返回值為final變量賦值。

? ? ?》final修飾的屬性不是基本類型。

建議14:使用序列化類的私有方法巧妙解決部分屬性持久化問題

? ? ?序列化過程中除了給不需要持久化的屬性上加瞬態(tài)關(guān)鍵字(transient關(guān)鍵字)之外,還有另一個(gè)方法。

? ? ?實(shí)現(xiàn)了Serializable接口的類可以實(shí)現(xiàn)兩個(gè)私有方法:writeObject和readObject,在方法的實(shí)現(xiàn)中只處理需要處理的部分屬性即可。

建議15:break萬萬不可忘

? ? ?在寫switch語句時(shí),每個(gè)case后必須帶有break。

? ? ?為了防止這種情況,可以在IDE中設(shè)置警告級(jí)別:

? ? ?Performaces->Java->Compiler->Errors/Warnings->Potential Programming probems,然后修改“switch

”case fall-through為Errors級(jí)別。

建議16:易變業(yè)務(wù)使用腳本語言編寫

? ? ?腳本語言的特性有靈活、便捷、簡(jiǎn)單。(如PHP、Ruby、Groovy、JavaScript等),而且是在運(yùn)行期解釋執(zhí)行。

? ? ?這正是Java所缺少的。

? ? ?于是Java6開始正是支持腳本語言,但是腳本語言較多。于是JCP(Java Community Process)提出了JSR規(guī)范,只要符合該規(guī)范的語言都可以在Java平臺(tái)上運(yùn)行(它對(duì)JavaScript是默認(rèn)支持的)。

? ? ?所以也可以自己寫個(gè)腳本語言,然后再實(shí)現(xiàn)ScriptEngine,即可在Java平臺(tái)上運(yùn)行。

建議17:慎用動(dòng)態(tài)編譯

? ? ?從Java6開始支持動(dòng)態(tài)編譯,可以在運(yùn)行期直接編譯.java文件,執(zhí)行.class,并且能夠獲得相關(guān)的輸入輸出,甚至還能監(jiān)聽相關(guān)的事件。

? ? ?Java的動(dòng)態(tài)編譯對(duì)源提供了多個(gè)渠道。比如可以是字符串,可以是文本,也可以是編譯過的字節(jié)碼文件,甚至可以是存放在數(shù)據(jù)庫(kù)中的明文代碼或是字節(jié)碼??傊?#xff0c;只要是符合Java規(guī)范的就都可以在運(yùn)行期動(dòng)態(tài)加載,其實(shí)現(xiàn)方式就是實(shí)現(xiàn)JavaFileObject接口,重寫getCharContent、openInputStream、openOutputStream,或者實(shí)現(xiàn)JDK已經(jīng)提供的兩個(gè)SimpleJavaFileObject、ForwardingJavaFileObject。

? ? ?因?yàn)殪o態(tài)編譯基本已經(jīng)可以滿足我們絕大多是需求,所以動(dòng)態(tài)編譯用的很少。即使真的需要,也有很好的代替方案,比兔Ruby、Groovy等無縫的腳本語言。

? ? ?使用動(dòng)態(tài)編譯時(shí)需要注意一下幾點(diǎn):

? ? ?(1)在框架中謹(jǐn)慎使用

? ? ? ? ? 比如在Struts中使用動(dòng)態(tài)編譯,動(dòng)態(tài)實(shí)現(xiàn)一個(gè)類,它若繼承自ActionSupport就希望它成為一個(gè)Action,能做到,但是debug很困難;在比如在Spring中,寫一個(gè)動(dòng)態(tài)類,要讓它動(dòng)態(tài)注入到Spring容器中,這是需要花費(fèi)老大功夫的。

? ? ?(2)不用在要求高性能的項(xiàng)目中使用

? ? ? ? ? 動(dòng)態(tài)編譯必究需要一個(gè)編譯的過程,與靜態(tài)編譯相比多了一個(gè)執(zhí)行環(huán)節(jié),因此在高性能項(xiàng)目中不要使用動(dòng)態(tài)編譯。不過,如果是工具類項(xiàng)目中它則可以很好地發(fā)揮其優(yōu)越性,比如在Eclipse工具寫一個(gè)插件,就可以很好的使用動(dòng)態(tài)編譯,不用重啟即可實(shí)現(xiàn)運(yùn)行、調(diào)試功能,非常方便。

? ? ?(3)動(dòng)態(tài)編譯要考慮安全問題

? ? ? ? ? 如果你在web頁面上提供了一個(gè)功能,允許上傳一個(gè)Java文件然后運(yùn)行,那就等于說;“我的機(jī)器沒有密碼,大家都來看我的隱私吧”,這是非常典型的注入漏洞,只有上傳一個(gè)而已Java程序就可以讓你所有的安全工作毀于一旦。

? ? ?(4)記錄動(dòng)態(tài)編譯過程

? ? ? ? ? 建議記錄源文件、目標(biāo)文件、編譯過程、執(zhí)行過程等日志,不僅僅是為了診斷,還是為了安全和審計(jì),對(duì)Java項(xiàng)目來說,空中編譯和運(yùn)行時(shí)很不讓人放心的,留下這些依據(jù)可以更好的優(yōu)化程序。

建議18:避免instanceof非預(yù)期結(jié)果

? ? ?instanceof是一個(gè)簡(jiǎn)單的二元操作符,它是用來判斷一個(gè)對(duì)象是否是一個(gè)類實(shí)例的。只有操作符兩邊的類有繼承或者實(shí)現(xiàn)關(guān)系就可以編譯通過。

?instanceof只能用于對(duì)象的判斷,不能用于基本類型的判斷。

? ? ?若有null則返回false。

建議19:斷言絕對(duì)不是雞肋

? ? ?斷言在很多語言中都存在,在防御式編程中經(jīng)常會(huì)用斷言(Assertion)對(duì)參數(shù)和環(huán)境做出判斷,避免程序因不當(dāng)?shù)妮斎牖蝈e(cuò)誤的環(huán)境而產(chǎn)生邏輯異常。斷言的基本語法:

? ? ?assert <布爾表達(dá)式>

? ? ?assert <布爾表達(dá)式> : <錯(cuò)誤信息>

? ? ?在布爾表達(dá)式為假時(shí),拋出AssetionError錯(cuò)誤,并附帶了錯(cuò)誤信息。assert的語法簡(jiǎn)單,有一些兩個(gè)特性

? ? ?(1)assert默認(rèn)不啟用(要啟用就需要在編譯、運(yùn)行時(shí)附加上相關(guān)的關(guān)鍵字)

? ? ?(2)assert拋出異常AssertionError是繼承自Error的

? ? ?斷言在兩種情況下不可使用:

? ? ?(1)在對(duì)外公開的方法中

? ? ?(2)在執(zhí)行邏輯代碼的情況下

? ? ?一般在以下情況下使用:

? ? ?(1)在私有方法中設(shè)置assert作為輸入?yún)?shù)的校驗(yàn)

? ? ?(2)流程控制中不可能達(dá)到的區(qū)域

? ? ?(3)建立程序探針

建議20:不要只替換一個(gè)類

? ? 我們經(jīng)常在系統(tǒng)中定義一個(gè)常量接口(或常量類),已囊括系統(tǒng)中所涉及的常量,從而簡(jiǎn)化代碼,方便開發(fā),在很多的開源項(xiàng)目中已采取了類似方式。

? ? ?但在原始時(shí)代(非IDE編碼)情況下,若改動(dòng)了常量類中的常量值,則另一個(gè)引用該值的類若不重新編譯,則還是記錄的常量類中原來的常量值(因?yàn)閒inal修飾的j常量,編譯器會(huì)任務(wù)它是穩(wěn)定態(tài)的,所以在編譯時(shí)直接把值編譯到字節(jié)碼中,避免了在運(yùn)行期的引用,所以若改變了常量類中的final常量值,除了重新編譯該常量類之外還要重新編譯引用類)。

? ? ?當(dāng)然IDE編碼時(shí)會(huì)自動(dòng)處理這種情況。

?????發(fā)布應(yīng)用程序系統(tǒng)是禁止使用類文件替換方式,整體war包發(fā)布才是萬全之策。

?

歡迎關(guān)注公眾號(hào):零點(diǎn)小時(shí)光

lingdianxiaoshiguang

?

總結(jié)

以上是生活随笔為你收集整理的01-第一章 Java开发中通用的方法和准则的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 寡妇高潮一级视频免费看 | 99精品国产免费 | 国产色a | 操批网站 | 久久亚洲一区二区 | 蜜桃av噜噜一区二区三区网址 | 欧美成年人 | sao虎视频在线精品永久 | 91嫩草影视 | 波多野结衣一区二区三区四区 | 婷婷丁香六月 | 国产精品伦子伦免费视频 | 五月激情婷婷在线 | 新红楼梦2005锦江版高清在线观看 | 在线观看网站污 | 亚洲色图欧美在线 | 免费成人看片 | 成人性生交视频免费观看 | 亚洲午夜av| 成人精品免费视频 | 成人三级电影网站 | 九九久久国产视频 | 日批免费在线观看 | www.在线看| 亚洲欧美网址 | 亚洲福利小视频 | 岳奶大又白下面又肥又黑水多 | 欧洲成人午夜精品无码区久久 | 国产 第1190页 | 久久成人乱码欧美精品一区二区 | 在线视频亚洲 | www.嫩草.com| 男生女生搞鸡视频 | 日韩欧美日本 | 乳揉みま痴汉4在线播放 | 三级做爰第一次 | 亚洲欧美日韩在线不卡 | 1769国产| 奇米在线视频 | 国模丫头1000人体 | 久久国产乱子伦免费精品 | 森泽佳奈av | 免费国偷自产拍精品视频 | 无码国产69精品久久久久网站 | 日韩一区二区在线观看 | 欧美精品色婷婷五月综合 | 色诱视频在线观看 | 久久r精品 | 在线播放网址 | 黄色动漫软件 | 精品久久久久久无码中文野结衣 | 中文字幕日韩一区二区 | 午夜精品久久久久久久久久久 | 国产视频在线一区二区 | 国产精品19p | 激情小说综合 | 瑟瑟视频免费看 | 国产成人影视 | 在线电影一区 | 特黄一区二区 | 伊人久久一区二区三区 | 亚洲性猛交xxxx乱大交 | 精品久久影视 | xxxx国产精品 | 精品国产一区二区三区在线观看 | 婷婷五月综合久久中文字幕 | 超碰在线免费公开 | 激情拍拍拍 | 热久久免费视频 | 久久久社区 | 国语久久 | 在线观看日本 | 在线免费观看av不卡 | 色哟哟精品一区 | 亚洲xxxx天美| 草草影院在线播放 | 精品国产伦一区二区三区免费 | 日韩电影在线一区二区 | 亚洲黄色片视频 | 成人h动漫精品一区二区器材 | 97香蕉超级碰碰久久免费软件 | 影音先锋亚洲资源 | 国产精品久久91 | 日中文字幕 | 国产福利免费看 | 国产无套视频 | 黄色网址最新 | 我把护士日出水了视频90分钟 | 成年人性视频 | 国产sm调教一区二区 | 国产91久久久 | 精品欧美一区二区三区成人 | 黄色一级二级 | 一区二区三区中文字幕 | 用舌头去添高潮无码视频 | 天天摸天天舔天天操 | 一边摸一边做爽的视频17国产 | 我和公激情中文字幕 | 特级西西人体444www |