hotspot 虛擬機(jī)(咱們平時(shí)開發(fā)用的sun公司的虛擬機(jī),其他兩大商用虛擬機(jī)是BEA的JRockit和IBM的J9)里面兩個(gè)字節(jié)來(lái)限制大小,所以最多65536行,超過(guò)javac會(huì)無(wú)法編譯。而且一個(gè)Java方法不能超過(guò)64k。一般一個(gè)Java類不要有太多行數(shù),如果一個(gè)Java代碼超過(guò)幾千甚至過(guò)萬(wàn),個(gè)人覺得應(yīng)該考慮一些代碼優(yōu)化方式,比如繼承;或者重新構(gòu)思這個(gè)類。代碼行數(shù)太多可讀性查,不利于維護(hù)。

成都創(chuàng)新互聯(lián)公司的客戶來(lái)自各行各業(yè),為了共同目標(biāo),我們?cè)诠ぷ魃厦芮信浜希瑥膭?chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對(duì)我們的要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。專業(yè)領(lǐng)域包括成都做網(wǎng)站、成都網(wǎng)站制作、電商網(wǎng)站開發(fā)、微信營(yíng)銷、系統(tǒng)平臺(tái)開發(fā)。
說(shuō)實(shí)話,理論上來(lái)說(shuō) 一個(gè)類可以有無(wú)數(shù)個(gè)方法,方法多到一定地步的話(怎么也得起碼近千吧)會(huì)影響電腦運(yùn)行;建議一個(gè)方法的最佳狀態(tài)應(yīng)該在20~30行之間,當(dāng)你的方法太長(zhǎng)時(shí),你就應(yīng)該想想是不是要另外提取方法,或者有沒(méi)有別的思路····
毫無(wú)影響,java編譯時(shí)就會(huì)確定方法的偏移量。java會(huì)自動(dòng)裝載,所以方法數(shù)量不是問(wèn)題。
不過(guò)過(guò)多的方法和行數(shù)會(huì)對(duì)解讀造成影響,造成可讀性差。另外一些計(jì)算測(cè)試代碼覆蓋率的程序無(wú)法處理過(guò)多行的代碼。
外界處于可讀性的考慮,要求處理類的代碼不可以超過(guò)2000行,一個(gè)方法不可以超過(guò)500行。
java中的一個(gè)方法體內(nèi)的代碼多長(zhǎng)是被限制的!
具體是怎么被限制的呢?
一般咱們都知道.java文件最后會(huì)經(jīng)過(guò)javac編譯成.class文件,方法體會(huì)編譯成java虛擬機(jī)識(shí)別的指令。在java中規(guī)定了指令的最大條數(shù),用4字節(jié)去存儲(chǔ)這個(gè)數(shù)字,可以想象一下這是一個(gè)很大的數(shù)(2的32次方減1),但是這是一個(gè)理論值,在java中明確規(guī)定一個(gè)方法的指令最多是65535條。具體你寫的代碼幾行編譯成一條指令,或是一行代碼編譯成幾條指令,這個(gè)就得看自己的代碼是怎么構(gòu)造的了。
例如在一個(gè)特別復(fù)雜的jsp頁(yè)面中,所有頁(yè)面內(nèi)容等都編譯到一個(gè)方法中,會(huì)出現(xiàn)編譯器拒絕的現(xiàn)象,這很有可能是編譯之后指令的條數(shù)太多了。
建議34: 構(gòu)造函數(shù)盡量簡(jiǎn)化
我們知道在通過(guò)new關(guān)鍵字生成對(duì)象時(shí)必然會(huì)調(diào)用構(gòu)造函數(shù),構(gòu)造函數(shù)的簡(jiǎn)繁情況會(huì)直接影響實(shí)例對(duì)象的創(chuàng)建是否繁瑣。在項(xiàng)目開發(fā)中,我們一般都會(huì)制訂構(gòu)造函數(shù)盡量簡(jiǎn)單,盡可能不拋異常,盡量不做復(fù)雜算法等規(guī)范,那如果一個(gè)構(gòu)造函數(shù)確實(shí)復(fù)雜了會(huì)怎么樣?我們來(lái)看一段代碼:
1 public class Client {
2 public static void main(String[] args) {
3 Server s = new SimpleServer(1000);
4 }
5 }
6
7 // 定義一個(gè)服務(wù)
8 abstract class Server {
9 public final static int DEFAULT_PORT = 40000;
10
11 public Server() {
12 // 獲得子類提供的端口號(hào)
13 int port = getPort();
14 System.out.println("端口號(hào):" + port);
15 /* 進(jìn)行監(jiān)聽動(dòng)作 */
16 }
17
18 // 由子類提供端口號(hào),并做可用性檢查
19 protected abstract int getPort();
20 }
21
22 class SimpleServer extends Server {
23 private int port = 100;
24
25 // 初始化傳遞一個(gè)端口號(hào)
26 public SimpleServer(int _port) {
27 port = _port;
28 }
29
30 // 檢查端口號(hào)是否有效,無(wú)效則使用默認(rèn)端口,這里使用隨機(jī)數(shù)模擬
31 @Override
32 protected int getPort() {
33 return Math.random() 0.5 ? port : DEFAULT_PORT;
34 }
35 }
該代碼是一個(gè)服務(wù)類的簡(jiǎn)單模擬程序,Server類實(shí)現(xiàn)了服務(wù)器的創(chuàng)建邏輯,子類只要在生成實(shí)例對(duì)象時(shí)傳遞一個(gè)端口號(hào)即可創(chuàng)建一個(gè)監(jiān)聽該端口的服務(wù),該代碼的意圖如下:
通過(guò)SimpleServer的構(gòu)造函數(shù)接收端口參數(shù)。
子類的構(gòu)造函數(shù)默認(rèn)調(diào)用父類的構(gòu)造函數(shù)。
父類構(gòu)造函數(shù)調(diào)用子類的getPort方法獲得端口號(hào)。
父類構(gòu)造函數(shù)建立端口監(jiān)聽機(jī)制。
對(duì)象創(chuàng)建完畢,服務(wù)監(jiān)聽啟動(dòng),正常運(yùn)行。
貌似很合理,再仔細(xì)看看代碼,確實(shí)也和我們的意圖相吻合,那我們嘗試多次運(yùn)行看看,輸出結(jié)果要么是“端口號(hào):40000”,要么是“端口號(hào):0”,永遠(yuǎn)不會(huì)出現(xiàn)“端口號(hào):100”或是“端口號(hào):1000”,這就奇怪了,40000還好說(shuō),但那個(gè)0是怎么冒出來(lái)的呢?代碼在什么地方出現(xiàn)問(wèn)題了?
要解釋這個(gè)問(wèn)題,我們首先要說(shuō)說(shuō)子類是如何實(shí)例化的。子類實(shí)例化時(shí),會(huì)首先初始化父類(注意這里是初始化,可不是生成父類對(duì)象),也就是初始化父類的變量,調(diào)用父類的構(gòu)造函數(shù),然后才會(huì)初始化子類的變量,調(diào)用子類自己的構(gòu)造函數(shù),最后生成一個(gè)實(shí)例對(duì)象。了解了相關(guān)知識(shí),我們?cè)賮?lái)看上面的程序,其執(zhí)行過(guò)程如下:
子類SimpleServer的構(gòu)造函數(shù)接收int類型的參數(shù):1000。
父類初始化常變量,也就是DEFAULT_PORT初始化,并設(shè)置為40000。
執(zhí)行父類無(wú)參構(gòu)造函數(shù),也就是子類的有參構(gòu)造中默認(rèn)包含了super()方法。
父類無(wú)參構(gòu)造函數(shù)執(zhí)行到“int port = getPort()”方法,調(diào)用子類的getPort方法實(shí)現(xiàn)。
子類的getPort方法返回port值(注意,此時(shí)port變量還沒(méi)有賦值,是0)或DEFAULT_PORT(此時(shí)已經(jīng)是40000)了。
父類初始化完畢,開始初始化子類的實(shí)例變量,port賦值100。
執(zhí)行子類構(gòu)造函數(shù),port被重新賦值為1000。
子類SimpleServer實(shí)例化結(jié)束,對(duì)象創(chuàng)建完畢。
終于清楚了,在類初始化時(shí)getPort方法返回的port值還沒(méi)有賦值,port只是獲得了默認(rèn)初始值(int類的實(shí)例變量默認(rèn)初始值是0),因此Server永遠(yuǎn)監(jiān)聽的是40000端口了(0端口是沒(méi)有意義的)。這個(gè)問(wèn)題的產(chǎn)生從淺處說(shuō)是由類元素初始化順序?qū)е碌模瑥纳钐幷f(shuō)是因?yàn)闃?gòu)造函數(shù)太復(fù)雜而引起的。構(gòu)造函數(shù)用作初始化變量,聲明實(shí)例的上下文,這都是簡(jiǎn)單的實(shí)現(xiàn),沒(méi)有任何問(wèn)題,但我們的例子卻實(shí)現(xiàn)了一個(gè)復(fù)雜的邏輯,而這放在構(gòu)造函數(shù)里就不合適了。
問(wèn)題知道了,修改也很簡(jiǎn)單,把父類的無(wú)參構(gòu)造函數(shù)中的所有實(shí)現(xiàn)都移動(dòng)到一個(gè)叫做start的方法中,將SimpleServer類初始化完畢,再調(diào)用其start方法即可實(shí)現(xiàn)服務(wù)器的啟動(dòng)工作,簡(jiǎn)潔而又直觀,這也是大部分JEE服務(wù)器的實(shí)現(xiàn)方式。
注意 構(gòu)造函數(shù)簡(jiǎn)化,再簡(jiǎn)化,應(yīng)該達(dá)到“一眼洞穿”的境界。
你把重復(fù)的代碼提取出來(lái)封裝成一個(gè)方法不就是了,無(wú)非就是
private?void?SendData(int?screenid,int?controlid,String?info)
{
UpdateTextData?data=new?UpdateTextData();
data.setScreen_id(screenid);
data.setControl_id(controlid);
data.SetStrings(info);
ListByte.......
RS232.write.......
}
之后在你的popupAlertWindow里就可以寫
SendData(7,5,String.valueOf(code));
SendData(7,5,type);
SendData(7,5,info);
網(wǎng)站名稱:java一個(gè)方法代碼太多,java重復(fù)代碼多怎么解決
URL分享:http://chinadenli.net/article5/dsidsii.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、App設(shè)計(jì)、云服務(wù)器、微信公眾號(hào)、服務(wù)器托管、電子商務(wù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)