运动基元_基元需要走吗?

运动基元

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

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

我没有什么清楚的记忆,我何时开始使用原始包装器,但是我确实记得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/338339.shtml

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

相关文章

mysql 三种工作模式_mybatis三种批量插入方式对比【面试+工作】

准备:1.表结构CREATE TABLE t_user (id varchar(32) CHARACTER SET utf8 NOT NULL COMMENT 主键,name varchar(50) CHARACTER SET utf8 DEFAULT NULL COMMENT 用户名,del_flag char(1) CHARACTER SET utf8 DEFAULT NULL COMMENT 删除标示,PRIMARY KEY (id)) ENGINEI…

C 常用新特性(下)

多线程什么是多线程这里就不过多介绍,新特性关于多线程最主要的就是std::thread的使用,它的使用也很简单,看代码:这里记住,std::thread在其对象生命周期结束时必须要调用join()或者detach(),否则程序会term…

ant 路径_在Ant中显示路径

ant 路径在博客文章Java and Ant Properties Refresher和Ant <echoproperties /> Task中 &#xff0c;我写了一篇关于如何了解Ant构建如何看到属性的文章&#xff0c;这有助于更好地理解该构建。 通常情况下&#xff0c;在构建过程中看到构建中使用的各种路径也很有价值&…

java8默认垃圾回收器,Java 8的默认垃圾收集器

What is the default garbage collector for Java 8?When I check the JMX Beans, they reveal it to be the parallel collector for the new generation and the old serial collector for the old generation.解决方案Selecting the default garbage collector (among othe…

c语言中结束本次循环的语句是什么

c语言中结束本次循环的语句是“continue”。控制语句continue只能作用于循环体中&#xff0c;其作用是结束本次循环&#xff0c;跳到判断循环的位置&#xff0c;即重新开始下一次循环。在C语言中&#xff0c;控制语句“continue”用于循环体中结束本次循环&#xff0c;重新开始…

jdk8 字符串_在JDK 8中连接字符串

jdk8 字符串JDK 8引入了语言功能&#xff0c;例如lambda表达式 &#xff0c; 流 &#xff0c;甚至是新的Date / Time API &#xff0c;这些都会改变我们编写Java应用程序的方式。 但是&#xff0c;还有一些新的API和功能可能不太“改变游戏规则”&#xff0c;但仍为Java编程语言…

C语言中要改变循环语句的流程可以使用的语句有哪些

C语言中要改变循环语句的流程可以使用的语句有&#xff1a;break&#xff0c;continue和goto。break语句可以终止循环而执行整个循环语句后面的代码&#xff1b;continue语句可以跳过循环体中剩余的语句而强制进入下一次循环。break关键字当 break 关键字用于 while、for 循环时…

apk图标存放位置_安卓系统下安装完apk程序后,具体的文件夹位置在哪里呢?

展开全部 有的程序的文件夹是自动建立在sd卡上的,有的程序是没有文件夹的,程序位于32313133353236313431303231363533e59b9ee7ad9431333365666238date/app文件夹内,而系统的程序位于system/app文件夹内。 软件安装完成后,就会在date/app目录出现一个apk文件。 这个文件相当…

java 线程什么时候出栈_在Java中给出的时间

java 线程什么时候出栈tl; dr&#xff0c;您可以使用标签来阐明给定的测试时间样式。 什么时候给出&#xff1f; 给定的时间&#xff0c;然后是指定系统行为的一种常用样式&#xff0c;其中您的测试分为三个部分。 给定的部分列出了测试的先决条件&#xff0c;即在您开始之前…

java 2_Java(二)

二维数组是由一维数组组成的数组选择排序原理将数组中每一个元素与第一个元素相比较&#xff0c;如果这个元素小于第一个元素&#xff0c;则交换这两个元素循环第一条规则&#xff0c;找出最小元素&#xff0c;放于第一个位置经过n-1轮比较完成排序冒泡排序原理逐一比较数组中相…

continue语句只用于循环语句中,它的作用是什么?

continue语句只用于循环语句中&#xff0c;它的作用是&#xff1a;跳过循环体中剩余的语句而强制进入下一次循环。continue语句只用在while、for循环中&#xff0c;常与if条件语句一起使用&#xff0c;判断条件是否成立。continue语句只用在while、for循环中&#xff0c;它的作…

成为java高手_我如何想成为Java

成为java高手我喜欢Java。 我喜欢用Java编程。 但是在使用Python一段时间后&#xff0c;我希望对其进行一些更改。 它几乎纯粹是语法上的&#xff0c;因此可能有更好的JVM语言&#xff0c;但是我并不真正感兴趣&#xff0c;因为我仍然需要使用普通的Java来工作。 我意识到这些更…

在c语言中引用数组元素时,其数组下标的数据类型允许是什么

在c语言中引用数组元素时&#xff0c;其数组下标的数据类型允许是&#xff1a;整型常量或整型表达式。C语言规定只能逐个引用数组元素而不能一次引用整个数组&#xff0c;数据元素的表示形式为“数组名[下标]”&#xff0c;下标可以是整型常量或整型表达式。数组中只有一维数组…

在c语言中char型数据在内存中的储存形式为什么

在c语言中char型数据在内存中的储存形式为“ASCII码”。在C语言中&#xff0c;将一个字符常量放到一个字符变量中&#xff0c;实际并不是把该字符本身放到内存单元中&#xff0c;而是将与该字符相对应的ASCII码放到存储单元中。c语言 char型字符型数据类型就是字符1、字符数据的…

集合相减算法java_集算器协助java处理结构化文本的集合运算

有两个小文件&#xff1a;f1.txt和f2.txt&#xff0c;第一行是列名&#xff0c;现在需要对文件中的Name字段进行交集运算。部分数据如下&#xff1a;文件f1.txt:文件f2.txt:集算器代码&#xff1a;A1、B1&#xff1a;用import函数将文件读[A1.(Name),B1.(Name)].isect()入内存&…

netbeans插件_如何编写NetBeans插件

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

c语言程序从哪里开始执行

c语言程序的执行总是起始于main函数。在一个C语言源程序中&#xff0c;无论main函数书写在程序的前部&#xff0c;还是后部&#xff0c;程序的执行总是从main函数开始&#xff0c;并且在main函数中结束。但需要注意的是&#xff0c;也是有特殊情况的&#xff0c;若是代码中出现…

基于价值链的流程框架分类_基于价值的类

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

java json 易用_Java中 Json的使用

Java JSON本章节我们将为大家介绍如何在 Java 语言中使用 JSON。类库选择Java中并没有内置JSON的解析&#xff0c;因此使用JSON需要借助第三方类库。下面是几个常用的 JSON 解析类库。Gson:谷歌开发的 JSON 库&#xff0c;功能十分全面。FastJson:阿里巴巴开发的 JSON 库&#…

C语言中数组所占字节怎么算

数组在内存中所占字节数可以使用sizeof操作符来计算&#xff0c;该操作符是专门用于检测类型或变量或数组在内存中所占有的空间&#xff08;字节数&#xff09;&#xff1b;语法“sizeof(x)”&#xff0c;其中x是类型名、变量名或数组名等&#xff0c;可以返回x所占字节数。C语…