dart语言和java语言_Java不是文明语言吗?
dart語言和java語言
幾周前,我有機會學(xué)習(xí)iOS編程。 我的老板認為我更像是“計算機科學(xué)家”,而不是開發(fā)人員,這意味著我可以將自己的知識應(yīng)用于開發(fā)一兩個iPad應(yīng)用程序–我要做的就是學(xué)習(xí)Objective-C, iOS SDK:到底有多難?盡管過去我做過很多C / C ++,但是自2001年以來我就一直在做Java,因此我?guī)缀跬浟宋宜赖暮芏嘀R,此外,Objective-C還是不太像C ++。 結(jié)果是,您感覺自己被沖到了國外,無法說這種語言,并且武裝著曬黑和詞典。
在學(xué)習(xí)所有這些新知識時,我意識到Java是一種非常好的語言,其原因首先是因為您不必考慮內(nèi)存分配和釋放,您可以繼續(xù)編寫應(yīng)用程序。 在用Objective-C編寫iOS應(yīng)用程序時,您既需要為對象分配內(nèi)存,然后又要清理,然后將對象的內(nèi)存返回給空閑池。 這似乎是21世紀第二個十年的老派。 此外,在為對象分配內(nèi)存后,您必須跟蹤對該對象的引用數(shù)量-一種稱為引用計數(shù)的實踐,這是我在前身為C ++程序員的過程中首次遇到的問題。 這里的基本思想是,每次創(chuàng)建對對象的新引用時,都將增加引用計數(shù)器,并且在完成對象引用后,將其引用計數(shù)器減一。
當計數(shù)器達到零時,系統(tǒng)將內(nèi)存釋放回空閑池。 在Objective-C中,減少引用計數(shù)的功能稱為release ; 因此,如果Java具有引用計數(shù),并且例如,如果我想讓AddressService查找我的地址,則需要執(zhí)行以下操作:
// 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();那是簡單的場景,但是如果某個方法或其他方法將對象引用作為方法參數(shù)傳遞給您,會發(fā)生什么情況? 在這種情況下,您必須決定如何堅持下去,似乎有兩種方法可以做到這一點。 第一個是復(fù)制對象,第二個是增加其引用計數(shù)。 制作副本可能是最安全的主意,但會占用更多的內(nèi)存并且會更慢,而增加引用計數(shù)很快,但不如程序的其他部分那么安全,可能會使引用計數(shù)錯誤并減少計數(shù)太多次,這意味著您已經(jīng)引用了一些可能已經(jīng)釋放的內(nèi)存,并且當您嘗試訪問釋放的對象時,程序?qū)⒈罎ⅰ?同樣,如果Java具有引用計數(shù),那么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";}這里有兩點需要注意–首先,將處理程序方法傳遞給模型對象,因此我通過調(diào)用keep來增加引用計數(shù),然后在方法結(jié)束后在模型上調(diào)用release來調(diào)用引用計數(shù)。 其次,即使在創(chuàng)建瑣碎的對象(例如傳遞給記錄器的消息字符串)時,您也必須應(yīng)用引用計數(shù)規(guī)則并在完成后釋放內(nèi)存。
下面的示例演示了增加引用計數(shù)的替代方法:制作自己的對象副本…
@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";}這些示例只是微不足道的,您需要應(yīng)用大量參考計數(shù)規(guī)則,如果弄錯了,Ka-Bam程序就會崩潰,弄錯了意味著您嘗試訪問已經(jīng)釋放的內(nèi)存,或者變慢由于忘記了釋放一些內(nèi)存而導(dǎo)致的內(nèi)存泄漏而死亡。 盡管我想這里的關(guān)鍵是所有權(quán) :如果您擁有一個對象,則增加它的引用計數(shù),當您完成一個對象后,再減少它的引用計數(shù)。
上面的代碼只是寫了些雜文來說明這一點-它不會編譯。 該代碼實際上來自我在GitHub上的Address示例,在現(xiàn)實生活中看起來像這樣:
@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";}……體積更小,更容易理解。 最后一點,你們中的有些人會注意到,在引用計數(shù)示例中,我分配了(Objective-C字)新的AddressService –這是因為iOS編程與依賴注入或Spring框架完全不同,因此您將回到為自己創(chuàng)建對象。 (在Spring給伙計們的說明:“ Spring iOS” –對我來說似乎是個主意……)
那些知道的人將著重強調(diào)一個事實,即蘋果公司最近推出了一種稱為“自動引用計數(shù)”的東西。 雖然它不是垃圾收集,它的簡化,內(nèi)部監(jiān)督辦公室現(xiàn)在會自動追蹤您的指針引用的內(nèi)存和可用內(nèi)存為你當計數(shù)達到為零,這意味著東西,你不必費心調(diào)用保留和釋放方法。
另外,此博客也沒有貶低Objective-C,我非常喜歡Objective-C。 與Java相比,它的語法看起來相當晦澀,讓人感到冗長,但是它迫使您在編程技術(shù)上要更有紀律,因此,如果像我一樣,您認為良好的編程取決于“思想的明確性”,那么在編寫目標代碼時-在C程序中,您必須更加清楚一點,而且我真的很喜歡。
我還猜想,很多讀者可能會提出許多原因,說明他們?yōu)槭裁凑J為Java是一種糟糕的語言,以及為什么他們喜歡的語言“做得更好”,無論它是什么,所以我很期待對您的評論...
最后,在iOS編程方面,我只是一個“新手”,因此,如果有任何iOS / Objective-C大師遇到過此博客,請告訴我我錯了。
參考: Java不是一種文明語言嗎? 來自我們的JCG合作伙伴 ? 調(diào)試隊長博客的 Roger Hughes。
翻譯自: https://www.javacodegeeks.com/2012/02/isnt-java-civilised-language.html
dart語言和java語言
總結(jié)
以上是生活随笔為你收集整理的dart语言和java语言_Java不是文明语言吗?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么百度网盘离线下载不能用了
- 下一篇: 事业单位岗位设置管理办法(事业单位岗位设