基元需要走吗?

我目前正在使用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秒算出功率,这款计算工具又快又准

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

如何编写NetBeans插件

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

Spring Batch教程–最终指南

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

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

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

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

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

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

基于价值的类

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

REST API的演变

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

Oracle MAF中的LOV

我们都喜欢最强大的ADF功能值列表之一。 使用它们&#xff0c;我们可以在ADF应用程序中声明性地轻松构建非常复杂的功能。 一件好事是&#xff0c;我们在Oracle MAF中也有类似的方法。 在ADF BC中&#xff0c;我们在业务服务级别&#xff08;基本上在实体或VO级别&#xff09;定…

怎么移动矩形选框工具选中的东西_ps矩形选框工具怎么用,你值得一看的技巧...

PS是一款非常好用的图片制作软件&#xff0c;我们可以使用矩形选框工具&#xff0c;选择自己需要的区域进行操作&#xff0c;下面小编就教大家ps矩形选框工具怎么用&#xff0c;希望可以帮助到大家。操作方法01首先我们打开PS进入到主界面&#xff0c;如图所示。02之后我们需要…

stream 过滤俩个字段_Java8 Stream:2万字20个实例,玩转集合的筛选、归约、分组、聚合...

点波关注不迷路&#xff0c;一键三连好运连连&#xff01;先贴上几个案例&#xff0c;水平高超的同学可以挑战一下&#xff1a;从员工集合中筛选出salary大于8000的员工&#xff0c;并放置到新的集合里。统计员工的最高薪资、平均薪资、薪资之和。将员工按薪资从高到低排序&…

一个JSF清单示例

这是使用JSF 2.0&#xff08;JavaServer Faces&#xff09;构建的示例列表应用程序。 该应用程序是待办事项列表。 该应用程序具有添加&#xff0c;编辑或删除列表中项目的功能。 待办事项具有名称和描述属性。 完成的应用程序的JSF页面具有&#xff1a; 使用h:selectOneList…

hdu 2444(二分图的判断以及求最大匹配)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2444思路&#xff1a;首先要判断能否构成二分图&#xff0c;用bfs对当前点u染色&#xff0c;对u的邻接点v的颜色进行判断&#xff0c;如果为染色&#xff0c;则染色后入队列&#xff0c;否则&#xff0c;判断co…

Delta架构:统一Lambda架构并利用Hadoop / REST中的Storm

最近&#xff0c;一群人要求我详细介绍我为我们的书《分布式实时计算的风暴蓝图》撰写的Druid / Storm集成。 德鲁伊很棒。 风暴很大。 两者一起解决了实时维查询/聚合问题。 实际上&#xff0c;人们正在将其视为主流&#xff0c;将其称为RAD Stack &#xff0c;并添加了“ La…

activiti mysql 版本_Mysql8.0.17版本不能自动创建activiti表的坑

maven项目如下&#xff1a;配置好数据库&#xff0c;和activiti的配置之后&#xff0c;开始执行流程部署package com.yuanqiao.first_activiti.deployment;import java.util.List;import org.activiti.engine.ProcessEngine;import org.activiti.engine.ProcessEngines;import …

Linux Kernel 多个本地信息泄露漏洞

漏洞名称&#xff1a;Linux Kernel 多个本地信息泄露漏洞CNNVD编号&#xff1a;CNNVD-201306-028发布时间&#xff1a;2013-06-04更新时间&#xff1a;2013-06-04危害等级&#xff1a; 漏洞类型&#xff1a; 威胁类型&#xff1a;本地CVE编号&#xff1a; 漏洞来源&#xff1a…

Spinner 学习笔记

Adapter 适配器//方法一&#xff1a;直接使用字符串数组//String[] sSexList new String[]{"男", "女"};//方法二&#xff1a;使用资源文件String[] sSexList getResources().getStringArray(R.array.Sexarray);//实例化一个集合适配器ArrayAdapter<S…

Java 8发布一年后,IDE和编译器尚未完全就绪

一年前&#xff0c;即2014年3月18日 &#xff0c;发布了Java SE 8&#xff0c;并伴随着通过lambda表达式和streams API实现了功能性编程的幸福。 这对于我们所有的Java生态系统都是个好消息&#xff0c;许多人已经升级到Java8。Stack Overflow已经提出了大约2500个有关Java 8的…

mysql注入提取邮件_【sql注入教程】mysql注入直接getshell

Mysql注入直接getshell的条件相对来说比较苛刻点把1:要知道网站绝对路径&#xff0c;可以通过报错&#xff0c;phpinfo界面&#xff0c;404界面等一些方式知道2:gpc没有开启&#xff0c;开启了单引号被转义了&#xff0c;语句就不能正常执行了3:要有file权限&#xff0c;默认情…

使用WildFly 8.2.0.Final,Primefaces 5.1和MySQL 5的JDBC领域和基于表单的身份验证

我会不时查看我博客上最受欢迎的内容&#xff0c;并尽力满足您的最佳需求。 因此&#xff0c;阅读我的博客是其他读者推动内容的一种方式。 另一种方法是通过评论或电子邮件与我联系。 今天&#xff0c;我将使用Primefaces修改我的JDBC Realm示例并将其更新到最新的WildFly服务…