基元需要走吗?

我目前正在使用JSF作为视图技术,使用JPA作为持久层的企业应用程序。 它可能是支持bean或服务方法中的某种东西,但令我震惊:是否有充分的理由在企业应用程序中使用原语?

当我开始围绕J2SE 1.2使用Java进行编程(或者是J2SE 5.0,或者也许是Java 2?)时,我仅在代码中使用了原语。 当时,我认为可以依靠默认值,而不必在使用之前初始化某些东西,这很好。 当时我对包装器并不了解太多,并且认为我没有充分的理由进一步研究它们。

我没有什么清楚的记忆,我何时开始使用原始包装器,但是我确实记得JDK 1.5何时允许在原始体及其各自的原始包装器类之间进行自动转换,或者通常称为自动装箱/拆箱。 很好,因为将int传递给需要Integer的方法并不重要,反之亦然。 语法糖似乎使编程容易一些。

构架

即使诸如JSF和JPA之类的Java企业框架为您做了很多工作,它也暴露了依赖自动装箱和原语的一些弱点。

这些框架依赖于原始包装类的使用,而不是各个原始包装类的使用。 如果使用JPA工具基于现有表创建实体,则该工具将使用变量类型的包装器。 JSF输入和转换器对对象进行操作。 使用JPA,必须这样做。 还记得原始的默认值吗? 基元的默认值可以与数据库中存储的值混淆。

如果将long用作简单的实体ID,则该实体的默认值为0L。 从技术上讲0L是一个值,因此很难知道该实体是否已保留。 如果id的类型为Long ,则很容易判断该实体是否已保留,因为id现在可以为null ,因此表示未持久的实体。

//id is long and entity is not persisted
long id = entity.getId();  //value of 0L
Long id = entity.getId();  //doesn’t help, still 0L//id is Long and entity is not persisted
Long id = entity.getId();  //null
long id = entity.getId();  //what happens here?
//reference: https://keyholesoftware.com/2014/10/13/java-and-the-sweet-science/

类型上下文

原始类型不能充分表达值的语义上下文。 假设我们从服务中检索今天的温度,并且返回的值表示度数是int 。 容易确定int度的上下文是什么?

首先,该值是以摄氏度还是华氏度表示的? 第二,如果值为0,该怎么办? 您将不得不假设该值是实际设置的,而不是默认值0。您可能想知道为什么当服务说它为0时,它感觉像是70度外。

最好的解决方案可能是使用解析为适当值的自定义对象,而不是使用原始或什至原始包装器。 对于代表温度的值,我们可以创建一个华氏温度对象。 该对象将消除对值上下文的所有怀疑。

//
public class Fahrenheit {
…private Integer degrees;
…
}Fahrenheit f = temperatureService.getDegrees(today);//

当该方法期望华氏温度时,开发人员将无法意外传入一个摄氏温度对象。

//
…
public Celsius convertDegrees(Fahrenheit f) {
…
}//only this would work
Celsius c = temperatureService.convertDegrees(f);//

使用原语作为返回值也可能是模棱两可的。 返回一个布尔值以表示某件事是否有效不一定表示发生了什么。 通过包含更多信息,使用Result对象更具描述性。

嘲笑

尽管模拟框架可以处理基元,但是模拟框架喜欢与对象一起使用。 下面的代码段是JMock中的Expectations类。 如下面的代码片段所示,一些自动装箱魔术使框架可以设置期望返回int值为6的期望。

Expectations.returnValue(Object result):        context.checking(new Expectations() {{atLeast(1).of(serviceMock).getPrimitive(5);will(returnValue(6));
….
}

无标题2

由于动态创建了数组对象,因此JMock似乎可以正确处理原始数组。

Expectations.returnValue(Object result):        context.checking(new Expectations() {{int[] ints = { 2, 3 };atLeast(1).of(serviceMock).getPrimitives(5);will(returnValue(ints));
….
}

无题3

即使基元和基元数组与模拟框架一起使用,也感觉您未在使用真实值。 您的参数是一个int ,但是模拟框架希望您使用Integer。

思想

  • 代码项目

回顾原始包装器的历史,随着时间的推移包装器的功能不断增强,自动装箱/拆箱以及从其他语言的开发人员那里阅读文章,感觉原始器可能已被排除在Java的最初实现之外。 Java是一种面向对象的语言,但是包含非对象原语。 自动装箱功能比真正的解决方案更像创可贴。

由于企业应用程序可以访问大量资源,因此我将其特定于企业应用程序。 该环境使创建使用诸如IntegerFahrenheit之类的对象的描述性代码变得更加容易。 在垃圾收集成本和堆大小很重要的受限设备中,原语很有意义,并且比对象同类具有优势。

翻译自: https://www.javacodegeeks.com/2015/02/do-primitives-need-to-go.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360708.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

输入参数_太实用!输入参数1秒算出功率,这款计算工具又快又准

随着互联网红利的不断加深,到了后期,不断地各种工具开始涌现,方便了很多用户,填补了市场上的很多空白,有生活娱乐类、提高效率类、垂直专业类、系统工具类等等。工业行业作为各行各业的大头,机械化、智能化…

功能工厂模式

您是否需要一种非常快速的方法来制作Factory对象? 然后,您需要lambda或其他函数传递! 它不仅快速,而且非常简单。 我敢打赌,如果您对Lambdas相当满意,那么您只需阅读标题就可以做到这一点。 如果您是其中之…

指向二维数组的指针测试

定义a为二维数组后,有三种成份:数组本身、3个一维数组(a的每一行对应一个一维数组)、12个数组元素, 由此就有三种指针及对应的指针变量, &a和int (*p1)[3&#xff3d…

python视频流传输_基于OpenCV的网络实时视频流传输的实现

很多小伙伴都不会在家里或者办公室安装网络摄像头或监视摄像头。但是有时,大家又希望能够随时随地观看视频直播。大多数人会选择使用IP摄像机(Internet协议摄像机)而不是CCTV(闭路电视),因为它们具有更高的分辨率并降低了布线成本。在本文中,…

如何编写NetBeans插件

是否想在NetBeans IDE中添加功能或自动执行某些操作? 跟随我们编写您的第一个NetBeans插件。 让我们超越简单的工具栏示例 ,创建一个可以自动更新的插件。 该代码基于NetBeans的WakaTime插件 。 我们的示例插件将仅打印Hello World语句,并在…

单机最大tcp连接数

单机最大tcp连接数 网络编程 在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接。那么对单机,其最大并发tcp连接数是多少? 如何标识一个TCP连接 在确定最大连接数之前&#xf…

用了fastapi还需要nginx_nginx 与 fastdfs 的配置过程,已经越过了许多坑,我跪着进入了欢迎页面。。。...

nginx 与 fastdfs 的配置过程,已经越过了许多坑,我跪着进入了欢迎页面。。。上面的是 fastdfs 与 nginx 的官网,我从这里面跌跌撞撞的走出来了,下面是我总结出来的一条平坦的路,小伙伴们可以参考参考。我下面的攻略其实…

Spring Batch教程–最终指南

这是Spring批处理教程,它是Spring框架的一部分。 Spring Batch提供了可重用的功能,这些功能对于处理大量记录至关重要,包括日志记录/跟踪,事务管理,作业处理统计信息,作业重新启动,跳过和资源管…

Neurocomputing 投稿注意事项

1. *.tex 和 *.bib 都以Manuscript项(Item)提交 (abstract.tex除外)2. abstract.tex以Abstract项(Item)提交3. *.eps以Figure项(Item)提交4. biographies.pdf以Biography of the aut…

箱式图 添加异常值平均值_什么是脏数据?怎样用箱形图分析异常值?终于有人讲明白了...

导读:数据质量分析是数据挖掘中数据准备过程的重要一环,是数据预处理的前提,也是数据挖掘分析结论有效性和准确性的基础。没有可信的数据,数据挖掘构建的模型将是空中楼阁。数据质量分析的主要任务是检查原始数据中是否存在脏数据…

[编程相关]正则表达式Regex语法

--目录-- 0. 前言1. 正则语法2. 正则搜索语法(1)字符集 Character_Classes(2)锚定符 Anchors(3)计数 Quantifiers(4)分组与索引 Group_And_Reference(5)周围 …

窗口程序ImageView(仿QQ图片查看器)

近期一直在学习窗口程序之类的问题,下午正好有机会和大家讨论一下. 程序运行截图: 应用方法: 1、直接把图像文件拖到图标上表现 2、通过命令行方式,示例:ImageView.exe "带全路径的图像文件名称" 3、打开ImageView.exe&…

华为硬件工程师社招机考题库_干货:2016年华为中兴硬件工程师笔试题目与经验...

1。一位工科男在拿到华为实习生offer后的面经干货某211学校,机械学院研究生。不得不说一下,华为的员工们真的是认真做事,因为怕我们担心下班轮不到面试。工作人员特意去休息区告诉我们,不面试完他们不会下班,果然是个爱…

USACO3.15stamps(dp)

对dp很无奈。。枚举所有可能达到的值 dp[i]表示到达i值所用最少的邮票 1 /*2 ID: shangca23 LANG: C4 TASK: stamps5 */6 #include <iostream>7 #include<cstdio>8 #include<cstring>9 #include<stdlib.h> 10 #include<algorithm> …

thinkcmf搭建教程_5分钟快速入门

# 5分钟快速入门[TOC1,5]## 1.创建模板目录在public/themes/目录下创建quick_start目录## 2.添加模板描述文件在public/themes/quick_start目录下创建manifest.json文件&#xff0c;内容如下&#xff1a;{"name": "quick_start","version": &quo…

WAV格式

查看下面文章时,请用记事本打开一个wav格式的文件. WAV格式是微软公司开发的一种声音文件格式&#xff0c;也叫波形声音文件&#xff0c;是最早的数字音频格式&#xff0c;被Windows平台及其应用程序广泛支持。WAV格式支持许多压缩算法&#xff0c;支持多种音频位数、采样频率和…

基于价值的类

在Java 8中&#xff0c;某些类在Javadoc中有一个小注释&#xff0c;说明它们是基于值的类 。 其中包括简短说明的链接&#xff0c;以及有关不使用它们的限制。 这很容易被忽略&#xff0c;如果这样做&#xff0c;则可能会在将来的Java版本中以微妙的方式破坏代码。 为了避免这种…

angular五大服务顺序,angularJS $事件处理程序的触发顺序

I was wondering two things, in the context of angularJS event handling.How is defined the order in which handlers listening to the same event are triggered?Is it a sign of a bad design if you start wondering about this?After reading documentation on angu…

地形 凹陷

地形凹下去&#xff1a;先要设置terrain-flattenheightmap 这个 转载于:https://www.cnblogs.com/wolfsky6/archive/2013/05/29/3106078.html

REST API的演变

每个开发人员都以某种方式接触到API 。 要么为一家大公司集成一个主要系统&#xff0c;或者使用最新的图形库生成一些精美的图表&#xff0c;要么直接与他喜欢的编程语言进行交互。 事实是&#xff0c;API无处不在&#xff01; 它们实际上代表了当今Internet的基本构建块&#…