Java不是文明語言嗎?

幾周前,我有機會學習iOS編程。 我的老板認為我更像是“計算機科學家”,而不是開發人員,這意味著我可以將自己的知識應用于開發一兩個iPad應用程序–我要做的就是學習Objective-C, iOS SDK:到底有多難?

盡管過去我做過很多C / C ++,但自2001年以來我一直在做Java,所以我實際上忘記了很多我所知道的東西,此外,Objective-C還是不太像C ++。 結果是,您覺得自己在異國他鄉被洗劫一空,無法說該語言,并且武裝著曬黑和詞典。

在學習所有這些新知識時,我意識到Java是一種非常好的語言,其原因首先是因為您不必考慮內存分配和釋放,您可以繼續編寫應用程序。 在用Objective-C編寫iOS應用程序時,您既要為對象分配內存,然后又要清理,然后將對象的內存返回給空閑池。 這似乎是21世紀第二個十年的老派。 此外,在為對象分配內存后,您必須跟蹤對該對象的引用數量-一種稱為引用計數的做法,這是我在前身為C ++程序員的過程中首次遇到的問題。 這里的基本思想是,每次創建對對象的新引用時,都將增加引用計數器,當完成對象引用后,您將減小其引用計數器。

當計數器達到零時,系統將內存釋放回空閑池。 在Objective-C中,減少引用計數的功能稱為release ; 因此,如果Java具有引用計數,并且例如,如果我想讓AddressService查找我的地址,則需要執行以下操作:

// create an object and set the reference count to 1AddressService addressService = new AddressService();  // Use the objectAddress address = addressService.findAddress(id);// pass it to a methodmodel.addAttribute("address", address);// free the memory addressService.release();

那是簡單的場景,但是如果某個方法或其他方法將對象引用作為方法參數傳遞給您,會發生什么情況? 在那種情況下,您必須決定如何堅持下去,似乎有兩種方法可以做到這一點。 第一個是復制對象,第二個是增加其引用計數。 制作副本可能是最安全的主意,但會占用更多內存并會變慢,而增加引用計數很快,但不如程序的其他部分那么安全,可能會使引用計數錯誤并使計數減少太多次,這意味著您已經引用了一些可能已釋放的內存,并且當您嘗試訪問釋放的對象時,程序將崩潰……。 同樣,如果Java具有引用計數,那么Spring Controller請求處理程序方法將如下所示:

@RequestMapping(value = "/find", method = RequestMethod.GET)public String findAddress(@RequestParam("id") int id, Model model) {// increment the reference count - 'retain' is the Objective-C method for doing this.model.retain();    // create a new string object - with reference count of oneString msg = new String().withFormat("Processing an address page request for address with id: " + id);// pass the string to the loggerlogger.info(msg);// release the string's memorymsg.release();AddressService addressService = new AddressService();Address address = addressService.findAddress(id);model.addAttribute("address", address);addressService.release();// finished with the modelmodel.release();return "address-display";}

這里有兩點需要注意–首先,將處理程序方法傳遞給模型對象,因此我通過調用keep來增加引用計數,然后在方法結束后在模型上調用release來調用引用計數。 其次,即使在創建瑣碎的對象(例如傳遞給記錄器的消息字符串)時,您也必須應用引用計數規則并在完成后釋放內存。

下面的示例演示了增加引用計數的替代方法:制作自己的對象副本…

@RequestMapping(value = "/find", method = RequestMethod.GET)public String findAddress(@RequestParam("id") int id, Model model) {// increment the reference count - 'retain' is the Objective-C method for doing this.Model myModel = model.copy();    // As previous example// finished with the modelmyModel.release();return "address-display";}

這些示例只是微不足道的,有大量引用計數規則需要應用,如果弄錯了,Ka-Bam程序就會崩潰,弄錯了意味著您嘗試訪問已經釋放的內存,或者變慢由于忘記了釋放一些內存而導致的內存泄漏而死亡。 盡管我猜這里的關鍵是所有權 :如果您擁有一個對象,則增加它的引用計數,當您完成一個對象后,再減少它的引用計數。

上面的代碼只是寫了些雜文來說明這一點–它不會編譯。 該代碼實際上來自我在GitHub上的Address示例,在現實生活中看起來像這樣:

@RequestMapping(value = "/find", method = RequestMethod.GET)public String findAddress(@RequestParam("id") int id, Model model) {logger.info("Processing an address page request for address with id: " + id);Address address = addressService.findAddress(id);model.addAttribute("address", address);return "address-display";}

……體積更小,更容易理解。 最后一點,你們中的一些人會注意到,在引用計數示例中,我分配了(Objective-C字)新的AddressService –這是因為iOS編程與依賴注入或Spring框架完全不同,因此您將回到為自己創建對象。 (在Spring給家伙們的說明:“ Spring iOS” –對我來說聽起來像是個主意……)

那些知道的人將著重強調一個事實,即蘋果公司最近推出了一種稱為“自動引用計數”的東西。 雖然它不是垃圾收集,它的簡化,內部監督辦公室現在會自動追蹤您的指針引用的內存和可用內存為你當計數達到為零,這意味著東西,你不必費心調用保留釋放方法。

另外,此博客也沒有貶低Objective-C –我非常喜歡Objective-C。 與Java相比,它的語法看起來相當晦澀難懂,但感覺很冗長,但是它迫使您在編程技術上要更有紀律,因此,如果像我一樣,您認為好的編程就取決于“思想的清晰性”,那么在編寫Objective-在C程序中,您必須更加清楚一點,而且我真的很喜歡。

我還猜想,很多讀者可能會提出許多原因,說明他們為什么認為Java是一種糟糕的語言,以及為什么他們喜歡的語言“做得更好”,無論它是什么,所以我很期待對您的評論...

最后,在iOS編程方面,我只是一個“新手”,因此,如果有任何iOS / Objective-C大師遇到此博客,請告訴我我錯了。

參考: Java不是一種文明語言嗎? 來自我們的JCG合作伙伴 ? 調試隊長博客的 Roger Hughes。


翻譯自: https://www.javacodegeeks.com/2012/02/isnt-java-civilised-language.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373311.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373311.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373311.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PHP 進程詳解

PHP 進程詳解PHP 進程詳解 如下內容從《操作系統精髓與設計原理》中總結提煉得出,刪除了大部分對于理解進程有干擾的文字,對進程知識結構進行的梳理。幾乎所有內容為按照書本上摘抄下來的,我目前還總結提煉不出像作者這么深刻的見解。那么就先…

35. Search Insert Position

public class Solution {public int searchInsert(int[] nums, int target) {int lennums.length;int i0;for(;i<len;i){if(nums[i]>target)break;}return i;} } 轉載于:https://www.cnblogs.com/aguai1992/p/5351442.html

MySQL 后from多個表_MYSQL回顧(多表查詢相關)

前言簡單的數據我們可以直接從一個表中獲取&#xff0c;但在真實的項目中查詢符合條件的數據通常需要牽扯到多張表&#xff0c;這就不得不使用多表查詢。多表查詢分為多表連接查詢、符合條件鏈接查詢、子查詢。多表連接查詢包括內連接、外連接、全連接。符合條件連接查詢本質上…

玩! 框架+ Google Guice

在我目前正在工作的項目中&#xff0c;我們開始使用Google Guice。 對于那些不知道的人&#xff0c; Google Guice是一個依賴項注入框架。 依賴項注入背后的基本思想是提供一個它依賴的類&#xff0c;而不是使依賴類負責實例化它所依賴的對象。 Play具有用于整合Guice的模塊&am…

java都要caps標點_第 1 章 管理 Java CAPS 用戶

第 1 章 管理 Java CAPS 用戶在此處列出的主題提供了有關如何管理 Sun JavaTM Composite Application Platform Suite (Java CAPS) 中的用戶的信息。如果您有任何問題&#xff0c;請參見 http://goldstar.stc.com/ 中的 Java CAPS Web 站點。管理系統信息庫用戶此類別包含以下用…

基于OpenCV 的美顏相機推送直播流

程序流程&#xff1a; 1.圖像采集 先從opencv&#xff08;2.4.10版本&#xff09;采集回來攝像頭的圖像&#xff0c;是一幀一幀的 每一幀圖像是一個矩陣&#xff0c;opencv中的mat 數據結構。 2.人臉的美化 人臉美化&#xff0c;我們用的皮膚檢測&#xff0c;皮膚在顏色空間是特…

Linux驅動開發常用頭文件

頭文件目錄中總共有32個.h頭文件。其中主目錄下有13個&#xff0c;asm子目錄中有4個&#xff0c;linux子目錄中有10個&#xff0c;sys子目錄中有5個。這些頭文件各自的功能如下&#xff1a; 1、主目錄 <a.out.h>&#xff1a;a.out頭文件&#xff0c;定義了a.out執行文件格…

Spring線程池服務

線程池對于執行同步和異步過程非常重要。 本文介紹如何使用Spring開發和監視線程池服務。 創建線程池已通過兩種替代方法進行了說明。 二手技術 &#xff1a; JDK 1.6.0_21 Spring3.0.5 Maven的3.0.2 步驟1&#xff1a;建立已完成的專案 創建一個Maven項目&#xff0c;如下…

我的世界java村民繁殖_我的世界:Java19w08a更新,村民加強守衛,小狐貍背叛

雖然這句話很繞口&#xff0c;其實意思很簡單&#xff0c;那就是之前的隱身藥水沒有什么用&#xff0c;該被打還是被打。因為這個可是害慘了流浪商人&#xff0c;不過這次好了&#xff0c;流浪商人在喝了隱身藥水之后就能安全度過晚上了。NO.3 皮革馬鎧馬鎧是屬于馬的盔甲&…

歐萊雅眉筆banner個人設計

眉筆名稱&#xff1a;眉筆大師三頭塑形眉筆 &#xff0c;之所以沒用吧這個商品名稱放大&#xff0c;是我覺得它是一個名稱&#xff0c;而我把自己想的廣告詞“出彩只需一筆” 放大不僅能凸顯出這只筆的強大&#xff0c;還表示了一種有了我這支眉筆你會更出彩更漂亮&#xff0c…

使用帶有注釋和JQuery的Spring MVC 3的Ajax

與Ajax一起工作對我來說一直很有趣&#xff01; 是不是 &#xff1f; 我將使您輕松將Ajax與Spring MVC 3和JQuery結合使用。 這篇文章將向您說明如何在工業編碼的現實生活中使用Ajax。 和往常一樣&#xff0c;我們將在Spring MVC 3框架中以Ajax的實際示例為例&#xff0c;并將其…

ThinkPHP 3 的輸出

一、ThinkPHP 3 的輸出 &#xff08;重點&#xff09;a、通過 echo 等PHP原生的輸出方式在頁面中輸出b、通過display方法輸出想分配變量可以使用assign方法c、修改左右定界符休要修改配置文件中的配置項TMPL_L_DELIM><{, //修改左定界符TMPL_R_DELIM>}>, //修…

java百度云文件上傳_關于如何在自己項目集成百度云BCE文件上傳STS方案

1、 項目背景由于本人項目需要&#xff0c;需要在視頻點播服務之中需要加載字幕文件(通用格式srt)&#xff0c;經過比較好幾家的公有云服務&#xff0c;最后選擇只有百度云提供字幕服務。字幕&#xff1a;我們通常在觀看外語電影的是&#xff0c;沒有國語版時候只能通過下載字幕…

Java 7 – NIO文件革命

Java 7&#xff08;“項目代幣”&#xff09;已于去年7月問世。 此版本中的新增功能很有用&#xff0c;例如&#xff0c;嘗試使用資源–從try塊自動處理可關閉的資源&#xff0c;switch語句中的字符串&#xff0c;用于異常的multicatch以及用于使用泛型的<>運算符。 每個…

hdu 3507 Print Article(斜率優化DP)

題目鏈接&#xff1a;hdu 3507 Print Article 題意&#xff1a; 每個字有一個值&#xff0c;現在讓你分成k段打印&#xff0c;每段打印需要消耗的值用那個公式計算&#xff0c;現在讓你求最小值 題解&#xff1a; 設dp[i]表示前i個字符需要消耗的最小值&#xff0c;那么有dp[i]…

第三章 consul服務注冊與服務查詢

1、定義一個服務 https://www.consul.io/docs/agent/services.html 該方法是服務注冊中提供服務的最常用的方法。 關于服務的定義&#xff1a;服務的屬性我們會在后邊每出現一個總結一個&#xff0c;最后再做總結。 2、服務注冊 2.1、創建服務文件所存放的文件夾 說明&#xff…

coreos 安裝mysql_CoreOS 在 PC 上快速安裝方法指南

意義能夠以最快的速度安裝部署Linux操作系統。安裝快速簡單&#xff0c;幾乎不花時間就可以開始運行Docker。運行速度非常快。使用內存硬盤。我的情況win8 筆記本偶爾玩游戲&#xff0c;但是裝Linux雙系統可能需要我一天的時間來完成。我的所有業務都只需要在Docker中跑就可以了…

使用ycsb測試cassandra

參考 https://github.com/cloudius-systems/osv/wiki/Benchmarking-Cassandra-and-other-NoSQL-databases-with-YCSB https://github.com/brianfrankcooper/YCSB/tree/master/cassandra 創建 表頭 https://gist.github.com/pbailis/3978273  設置field參數 長度和個數 啟動和…

Session 的配置和特性

session的配置 對于session的配置是php.ini中配置 session數據都是保存在文本文件中 設置session文件的保存位置 說明&#xff1a; 默認是保存在windows/temp目錄 設置session保存作為客戶端標識的數據使用cookie 設置session保存客戶端標識的數據&#xff0c;只使用cookie 說明…

OAuth與Spring Security

摘自Wikipedia&#xff1a; OAuth &#xff08; 開放式身份驗證 &#xff09;是一種開放式身份驗證標準。 它允許用戶與其他站點共享存儲在一個站點上的私有資源&#xff08;例如照片&#xff0c;視頻&#xff0c;聯系人列表&#xff09;&#xff0c;而不必發出其憑據&#xff…