1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      包含java抽離代碼的詞條

      Java是不是需要盡量把代碼拆分成一個(gè)一個(gè)方法啊?教程里是把for循環(huán)分成了兩個(gè)方法,而我寫成了一

      哈,你的寫在一起是沒問題的.

      目前創(chuàng)新互聯(lián)建站已為上千多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計(jì)、廣饒網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

      在Clean code(整潔代碼)里面,提供把功能拆分和抽取,比如你的方法里面有一個(gè)判斷字符串是否為空的代碼:

      if(null==str||"".equals(str.trim()){....}

      而你這一段代碼,在其他地方也經(jīng)常復(fù)用,那么你就可以抽取出去成為一個(gè)工具類了

      public?class?StrUtil{

      public?boolean?isEmpty(String?str){

      return?null==str?||"".equals(str.trim());

      }

      }

      那么在你之前的代碼里面可以使用,以下的來代替

      if(StrUtil.isEmpty(str)){

      ....

      }

      這樣子,你的代碼重用性和可閱讀性就提高不少了.

      要怎樣子才抽取出去呢? 最簡單的2點(diǎn)

      同一段代碼多次重用.

      職能單一,一個(gè)方法只實(shí)現(xiàn)一種功能

      詳細(xì)資料,推薦書籍:CleanCode代碼整潔之道

      java問題:提取出需要的代碼如下:

      因?yàn)?/p>

      mydb.doPstm(sql, params);

      方法雖然是另一個(gè)類中的,但是傳入的參數(shù)是OpGetListBox(String sql,Object[] params)的第二個(gè)形式參數(shù)---params呀!也就是說

      mydb.doPstm(sql, params);方法的兩個(gè)參數(shù)使用的是OpGetListBox(String sql,Object[] params)方法的兩個(gè)傳入?yún)?shù),因此名稱必須完全一致,如果要修改的話兩者都必須同時(shí)修改,否則無法識別。

      程序員新人周一優(yōu)化一行代碼,周三被勸退?

      這周一,公司新來了一個(gè)同事,面試的時(shí)候表現(xiàn)得非常不錯(cuò),各種問題對答如流,老板和我都倍感欣慰。

      這么優(yōu)秀的人,絕不能讓他浪費(fèi)一分一秒,于是很快,我就發(fā)他了需求文檔、源碼,讓他先在本地熟悉一下業(yè)務(wù)和開發(fā)流程。

      結(jié)果沒想到,周三大家一塊 review 代碼的時(shí)候就發(fā)現(xiàn)了問題,新來的同事直接把原來 @Transactional 優(yōu)化成了這個(gè)鬼樣子:

      就因?yàn)檫@一行代碼,老板(當(dāng)年也是一線互聯(lián)網(wǎng)大廠的好手)當(dāng)場就發(fā)飆了,馬上就要勸退這位新同事,我就趕緊打圓場,畢竟自己面試的人,不看僧面看佛面,是吧?于是老板答應(yīng)我說再試用一個(gè)月看看。

      會議結(jié)束后,我就趕緊讓新同事復(fù)習(xí)了一遍事務(wù),以下是他自己做的總結(jié),還是非常詳細(xì)的,分享出來給大家一點(diǎn)點(diǎn)參考和啟發(fā)。相信大家看完后就明白為什么不能這樣優(yōu)化 @Transactional 注解了,純屬畫蛇添足和亂用。

      事務(wù)在邏輯上是一組操作, 要么執(zhí)行,要不都不執(zhí)行 。主要是針對數(shù)據(jù)庫而言的,比如說 MySQL。

      只要記住這一點(diǎn),理解事務(wù)就很容易了。在 Java 中,我們通常要在業(yè)務(wù)里面處理多個(gè)事件,比如說編程喵有一個(gè)保存文章的方法,它除了要保存文章本身之外,還要保存文章對應(yīng)的標(biāo)簽,標(biāo)簽和文章不在同一個(gè)表里,但會通過在文章表里(posts)保存標(biāo)簽主鍵(tag_id)來關(guān)聯(lián)標(biāo)簽表(tags):

      那么此時(shí)就需要開啟事務(wù),保證文章表和標(biāo)簽表中的數(shù)據(jù)保持同步,要么都執(zhí)行,要么都不執(zhí)行。

      否則就有可能造成,文章保存成功了,但標(biāo)簽保存失敗了,或者文章保存失敗了,標(biāo)簽保存成功了——這些場景都不符合我們的預(yù)期。

      為了保證事務(wù)是正確可靠的,在數(shù)據(jù)庫進(jìn)行寫入或者更新操作時(shí),就必須得表現(xiàn)出 ACID 的 4 個(gè)重要特性:

      其中,事務(wù)隔離又分為 4 種不同的級別,包括:

      需要格外注意的是: 事務(wù)能否生效,取決于數(shù)據(jù)庫引擎是否支持事務(wù),MySQL 的 InnoDB 引擎是支持事務(wù)的,但 MyISAM 就不支持 。

      1)編程式事務(wù)

      編程式事務(wù)是指將事務(wù)管理代碼嵌入嵌入到業(yè)務(wù)代碼中,來控制事務(wù)的提交和回滾。

      你比如說,使用 TransactionTemplate 來管理事務(wù):

      再比如說,使用 TransactionManager 來管理事務(wù):

      就編程式事務(wù)管理而言,Spring 更推薦使用 TransactionTemplate。

      在編程式事務(wù)中,必須在每個(gè)業(yè)務(wù)操作中包含額外的事務(wù)管理代碼,就導(dǎo)致代碼看起來非常的臃腫,但對理解 Spring 的事務(wù)管理模型非常有幫助。

      當(dāng)然了,要想實(shí)現(xiàn)事務(wù)管理和業(yè)務(wù)代碼的抽離,就必須得用到 Spring 當(dāng)中最關(guān)鍵最核心的技術(shù)之一,AOP,其本質(zhì)是對方法前后進(jìn)行攔截,然后在目標(biāo)方法開始之前創(chuàng)建或者加入一個(gè)事務(wù),執(zhí)行完目標(biāo)方法之后根據(jù)執(zhí)行的情況提交或者回滾。

      Spring 將事務(wù)管理的核心抽象為一個(gè)事務(wù)管理器(TransactionManager),它的源碼只有一個(gè)簡單的接口定義,屬于一個(gè)標(biāo)記接口:

      通過 PlatformTransactionManager 這個(gè)接口,Spring 為各個(gè)平臺如 JDBC(DataSourceTransactionManager)、Hibernate(HibernateTransactionManager)、JPA(JpaTransactionManager)等都提供了對應(yīng)的事務(wù)管理器,但是具體的實(shí)現(xiàn)就是各個(gè)平臺自己的事情了。

      參數(shù) TransactionDefinition 和 @Transactional 注解是對應(yīng)的,比如說 @Transactional 注解中定義的事務(wù)傳播行為、隔離級別、事務(wù)超時(shí)時(shí)間、事務(wù)是否只讀等屬性,在 TransactionDefinition 都可以找得到。

      返回類型 TransactionStatus 主要用來存儲當(dāng)前事務(wù)的一些狀態(tài)和數(shù)據(jù),比如說事務(wù)資源(connection)、回滾狀態(tài)等。

      TransactionDefinition.java:

      Transactional.java

      說到這,我們來詳細(xì)地說明一下 Spring 事務(wù)的傳播行為、事務(wù)的隔離級別、事務(wù)的超時(shí)時(shí)間、事務(wù)的只讀屬性,以及事務(wù)的回滾規(guī)則。

      當(dāng)事務(wù)方法被另外一個(gè)事務(wù)方法調(diào)用時(shí),必須指定事務(wù)應(yīng)該如何傳播 ,例如,方法可能繼續(xù)在當(dāng)前事務(wù)中執(zhí)行,也可以開啟一個(gè)新的事務(wù),在自己的事務(wù)中執(zhí)行。

      TransactionDefinition 一共定義了 7 種事務(wù)傳播行為:

      01、 PROPAGATION_REQUIRED

      這也是 @Transactional 默認(rèn)的事務(wù)傳播行為,指的是如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則創(chuàng)建一個(gè)新的事務(wù)。更確切地意思是:

      這個(gè)傳播行為也最好理解,aMethod 調(diào)用了 bMethod,只要其中一個(gè)方法回滾,整個(gè)事務(wù)均回滾。

      02、 PROPAGATION_REQUIRES_NEW

      創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。也就是說不管外部方法是否開啟事務(wù),Propagation.REQUIRES_NEW 修飾的內(nèi)部方法都會開啟自己的事務(wù),且開啟的事務(wù)與外部的事務(wù)相互獨(dú)立,互不干擾。

      如果 aMethod()發(fā)生異常回滾,bMethod()不會跟著回滾,因?yàn)?bMethod()開啟了獨(dú)立的事務(wù)。但是,如果 bMethod()拋出了未被捕獲的異常并且這個(gè)異常滿足事務(wù)回滾規(guī)則的話,aMethod()同樣也會回滾。

      03、 PROPAGATION_NESTED

      如果當(dāng)前存在事務(wù),就在當(dāng)前事務(wù)內(nèi)執(zhí)行;否則,就執(zhí)行與 PROPAGATION_REQUIRED 類似的操作。

      04、 PROPAGATION_MANDATORY

      如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則拋出異常。

      05、 PROPAGATION_SUPPORTS

      如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒有事務(wù),則以非事務(wù)的方式繼續(xù)運(yùn)行。

      06、 PROPAGATION_NOT_SUPPORTED

      以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則把當(dāng)前事務(wù)掛起。

      07、 PROPAGATION_NEVER

      以非事務(wù)方式運(yùn)行,如果當(dāng)前存在事務(wù),則拋出異常。

      3、4、5、6、7 這 5 種事務(wù)傳播方式不常用,了解即可。

      前面我們已經(jīng)了解了數(shù)據(jù)庫的事務(wù)隔離級別,再來理解 Spring 的事務(wù)隔離級別就容易多了。

      TransactionDefinition 中一共定義了 5 種事務(wù)隔離級別:

      通常情況下,我們采用默認(rèn)的隔離級別 ISOLATION_DEFAULT 就可以了,也就是交給數(shù)據(jù)庫來決定,可以通過 SELECT @@transaction_isolation; 命令來查看 MySql 的默認(rèn)隔離級別,結(jié)果為 REPEATABLE-READ,也就是可重復(fù)讀。

      事務(wù)超時(shí),也就是指一個(gè)事務(wù)所允許執(zhí)行的最長時(shí)間,如果在超時(shí)時(shí)間內(nèi)還沒有完成的話,就自動回滾。

      假如事務(wù)的執(zhí)行時(shí)間格外的長,由于事務(wù)涉及到對數(shù)據(jù)庫的鎖定,就會導(dǎo)致長時(shí)間運(yùn)行的事務(wù)占用數(shù)據(jù)庫資源。

      如果一個(gè)事務(wù)只是對數(shù)據(jù)庫執(zhí)行讀操作,那么該數(shù)據(jù)庫就可以利用事務(wù)的只讀屬性,采取優(yōu)化措施,適用于多條數(shù)據(jù)庫查詢操作中。

      這是因?yàn)?MySql(innodb)默認(rèn)對每一個(gè)連接都啟用了 autocommit 模式,在該模式下,每一個(gè)發(fā)送到 MySql 服務(wù)器的 SQL 語句都會在一個(gè)單獨(dú)的事務(wù)中進(jìn)行處理,執(zhí)行結(jié)束后會自動提交事務(wù)。

      那如果我們給方法加上了 @Transactional 注解,那這個(gè)方法中所有的 SQL 都會放在一個(gè)事務(wù)里。否則,每條 SQL 都會單獨(dú)開啟一個(gè)事務(wù),中間被其他事務(wù)修改了數(shù)據(jù),都會實(shí)時(shí)讀取到。

      有些情況下,當(dāng)一次執(zhí)行多條查詢語句時(shí),需要保證數(shù)據(jù)一致性時(shí),就需要啟用事務(wù)支持。否則上一條 SQL 查詢后,被其他用戶改變了數(shù)據(jù),那么下一個(gè) SQL 查詢可能就會出現(xiàn)不一致的狀態(tài)。

      默認(rèn)情況下,事務(wù)只在出現(xiàn)運(yùn)行時(shí)異常(Runtime Exception)時(shí)回滾,以及 Error,出現(xiàn)檢查異常(checked exception,需要主動捕獲處理或者向上拋出)時(shí)不回滾。

      如果你想要回滾特定的異常類型的話,可以這樣設(shè)置:

      以前,我們需要通過 XML 配置 Spring 來托管事務(wù),有了 Spring Boot 之后,一切就變得更加簡單了,只需要在業(yè)務(wù)層添加事務(wù)注解( @Transactional )就可以快速開啟事務(wù)。

      也就是說,我們只需要把焦點(diǎn)放在 @Transactional 注解上就可以了。

      雖然 @Transactional 注解源碼中定義了很多屬性,但大多數(shù)時(shí)候,我都是采用默認(rèn)配置,當(dāng)然了,如果需要自定義的話,前面也都說明過了。

      1)要在 public 方法上使用,在AbstractFallbackTransactionAttributeSource類的computeTransactionAttribute方法中有個(gè)判斷,如果目標(biāo)方法不是public,則TransactionAttribute返回null,即不支持事務(wù)。

      2)避免同一個(gè)類中調(diào)用 @Transactional 注解的方法,這樣會導(dǎo)致事務(wù)失效。

      在測試之前,我們先把 Spring Boot 默認(rèn)的日志級別 info 調(diào)整為 debug,在 application.yml 文件中 修改:

      然后,來看修改之前查到的數(shù)據(jù):

      開搞。在控制器中添加一個(gè) update 接口,準(zhǔn)備修改數(shù)據(jù),打算把沉默王二的狗腿子修改為沉默王二的狗腿:

      在 Service 中為方法加上 @Transactional 注解并拋出運(yùn)行時(shí)異常:

      按照我們的預(yù)期,當(dāng)執(zhí)行 save 保存數(shù)據(jù)后,因?yàn)槌霈F(xiàn)了異常,所以事務(wù)要回滾。所以數(shù)據(jù)不會被修改。

      在瀏覽器中輸入 進(jìn)行測試,注意查看日志,可以確認(rèn)事務(wù)起效了。

      當(dāng)我們把事務(wù)去掉,同樣拋出異常:

      再次執(zhí)行,發(fā)現(xiàn)雖然程序報(bào)錯(cuò)了,但數(shù)據(jù)卻被更新了。

      這也間接地證明,我們的 @Transactional 事務(wù)起效了。

      看到這,是不是就明白為什么新同事的優(yōu)化純屬畫蛇添足/卵用了吧?

      java 中怎樣將屏蔽掉的代碼拆起來

      編程的初期可以把checkStyle、findBugs這些都disable掉。因?yàn)闄z查代碼都是后期的工作,首先要讓程序能夠跑起來,然后再考慮效率問題,最后才考慮代碼格式等次重要的東西。

      一般來說checkStyle的警告都是可以不予理睬的,比如說name hides a field、magic number,對你編程沒有影響。但是對開發(fā)軟件產(chǎn)品來說,這個(gè)是最后必須要消除的。因?yàn)檫@將影響你寫的代碼的可讀性,進(jìn)而影響到將來代碼優(yōu)化和維護(hù)。

      name hides a field警告指方法的參數(shù)和類里面定義的域(或者說是成員變量,數(shù)據(jù)成員)重名了,換個(gè)其他名字就行了,比如說name改為n。

      magic number就是指程序里那些不用取變量名,直接把常量值寫在使用它的地方的那種數(shù)字。這種數(shù)字往往讓人摸不著頭腦,也不知道那是什么意義,就像毫無原因,突然被變出來的一樣,所以被稱為“魔術(shù)數(shù)字”。

      解決magic number的方法就是把所有用到的常量都聲明為public static final,

      注釋是相當(dāng)重要的,即使是自己開發(fā)的,時(shí)間久了也許都會忘記某個(gè)變量是用來干什么的……

      java 抽象方法 可以有參數(shù)嗎?

      肯定可以啊,抽象方法一般存在于抽象類中

      而抽象類就將所有基礎(chǔ)子類的共有特性抽離出來,避免代碼重復(fù)。

      所以抽象類就是用來作為父類讓子類繼承的

      子類可以去重寫父類的方法,擴(kuò)展自己特有的方法

      Java隨機(jī)抽取人名完整代碼是什么?

      public class test {\x0d\x0a public static void main(String[] args) {\x0d\x0a //定義人名數(shù)組\x0d\x0a String [] name = {"張三","李四","王五","八神庵","不知火舞","大蛇","景天","唐雪見","李逍遙","趙靈兒"};\x0d\x0a//隨機(jī)生成數(shù)組下標(biāo)、\x0d\x0a int num = (int)(Math.random() * 1000);\x0d\x0a//對生成的隨機(jī)數(shù)進(jìn)行判斷,如果小于數(shù)組下標(biāo),就跳出循環(huán)\x0d\x0awhile (numname.length-1) {\x0d\x0a if (num

      回答于?2022-11-16


      分享題目:包含java抽離代碼的詞條
      分享網(wǎng)址:http://www.ef60e0e.cn/article/docjspi.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        长顺县| 弋阳县| 平乐县| 辽阳市| 乌兰浩特市| 沂南县| 湄潭县| 赤水市| 东城区| 宝坻区| 綦江县| 博客| 江西省| 临桂县| 海宁市| 田阳县| 弥勒县| 万盛区| 辽宁省| 康平县| 洪雅县| 鲁山县| 茌平县| 含山县| 吉木萨尔县| 北海市| 松潘县| 花莲市| 葫芦岛市| 桂阳县| 抚顺县| 吉木萨尔县| 民乐县| 屯门区| 南雄市| 平阳县| 上思县| 阜新市| 中阳县| 汤原县| 涪陵区|