在Java中,实体和模型应该使用原语还是对象?
作为Java初学者,我在实体类或模型类中选择变量类型时感到困惑。如前所述,它们都有一些优点和缺点,例如内存使用。但是,我想知道创建实体或模型类时的一般方法。所以,在这种情况下,对于long、boolean、int等变量,我应该选择原语还是对象类型,如下所示在Java中,实体和模型应该使用原语还是对象?,java,primitive,Java,Primitive,作为Java初学者,我在实体类或模型类中选择变量类型时感到困惑。如前所述,它们都有一些优点和缺点,例如内存使用。但是,我想知道创建实体或模型类时的一般方法。所以,在这种情况下,对于long、boolean、int等变量,我应该选择原语还是对象类型,如下所示 public class Student { private Long id; // long ? private String name; private Boolean isGra
public class Student {
private Long id; // long ?
private String name;
private Boolean isGraduated; // boolean ?
private Integer age; // int ?
}
我认为没有理由在您的案例中使用对象,但也不认为使用它们会极大地影响性能。就我个人而言,如果我没有使用对象的特定原因(例如需要
ArrayList
或任何其他通用集合),我会使用原语
同样,如果我确实需要大量的整数集合,我会使用数组(例如int[]
)
编辑:评论中有人问为什么人们喜欢
列表
而不是传统的数组。诸如ArrayList
之类的集合是可变的,易于使用。将元素添加到数组列表中比较:
List collection=new ArrayList();
添加(新的MyClass());
…要向数组中添加元素,请执行以下操作:
公共静态int[]addElement(int sourceArr[],int e)
{
int newArr[]=newint[sourceArr.length+1];
for(int i=0;i
变量Long和Integer的默认值为null
但是long和int的默认值是0
比较:
如果使用对象:
public class Student {
private Long id; // long ?
private String name;
private Boolean isGraduated; // boolean ?
private Integer age; // int ?
}
id => null
age => null
如果使用基本体:
public class Student {
private long id; // long ?
private String name;
private Boolean isGraduated; // boolean ?
private int age; // int ?
}
id => 0
age => 0
在许多情况下,将0作为默认值是令人困惑的,因此在这种情况下使用对象是有意义的。如果对象值为“null”,则可以确定该值未初始化。但如果原语值为“0”,则不清楚:它是默认的未初始化值,还是该值已初始化为“0”
我通常更喜欢使用原语类型,除非我需要显式的null检查这两种方法都可以
正如您所指出的,原语需要更少的内存。但对象具有优势,特别是在某些情况下,对象将是预期对象而不是原语。在某些情况下,可能需要一个原语,尽管自动装箱通常会处理这个问题。当遇到这些情况时,编译器肯定会提醒您
以及关于基本体具有默认值而对象不具有默认值。根据编码情况,两者都可能是一种优势
请记住,对于您的大部分工作,您不必担心这一点。这种担心就是过早优化的一个例子。你几乎肯定有更重要的事情要担心
对于许多常见的商业应用程序,内存使用是无关紧要的。我自己的默认设置是使用对象,这是为了方便和功能。从这些年来我所注意到的情况来看,用法似乎相当分裂,有些人倾向于原语,有些人倾向于对象
我对原语和对象的唯一考虑是,在处理大量数据的循环时,在哪里可以调用。在这种情况下,仅仅声明int
与Integer
之间的比较可能会通过避免无意义的装箱产生重大影响。但是,同样,不要过分担心这一点,因为依赖自动装箱是完全可以接受的,而且通常是最好的策略
记录
Java16现在提供了这个特性。记录是编写类的一种简单方法,其主要目的是以透明和不变的方式传输数据。您只需声明成员字段类型和名称。编译器隐式生成构造函数、getter、equals
&hashCode
和toString
方法
我提到记录只是想说这个方便的新功能,可能会非常流行,同时支持对象和原语。因此,使用记录不会影响对象对原语的决策
您的示例类是:
public record Student( Long id , String name , Boolean isGraduated , Integer age ) {}
…或:
public record Student( long id , String name , boolean isGraduated , int age ) {}
用法与常规类相同
Student alice = new Student( 101L , "Alice" , false , 33 ) ;
模糊差异
您应该知道,Oracle的Java团队和相关社区对模糊原语和对象之间的区别很感兴趣。当然,诀窍在于这样做的同时尊重Java平台的一个标志性的极端向后兼容性
其中一些工作是作为的一部分完成的,包括可能向Java添加值类型
要了解更多关于这方面未来可能的方向,请参阅Oracle的Brian Goetz和其他人的演讲。使用你最喜欢的搜索引擎来搜索。您将找到指向JEP的链接,如:
- (更新日期:2021-05)
- (更新日期:2021-05)
- (2017-10年更新)
- (2019-10年更新)
正如其他人所指出的,您可以使用任何一种方法
作为Basil Bourque,如果您使用内存使用率(或其他某种运行时效率度量)作为您决定。。。这很可能是过早的优化。这些差异很可能太小而无关紧要
那么你应该如何决定呢
这取决于你。但是我的My你应该考虑这个领域的可空性。如果可以为空,您应该使用object。这个问题实际上是基于观点的,可能不在这里。然而,我很少看到有人在泛型之外使用装箱原语。@HenryTwist堆栈溢出的“基于意见”策略旨在避免冗长的、不可能解决的开放式讨论。我认为这不一定适用于这个问题。有一些具体的技术优点和缺点可以作为考虑因素提出
private Integer field; // defaults to null which may lead to an NPE
Integer a = ...
Integer b = ...
if (a == b) // MISTAKE