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.mzph.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…