Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,实体和模型应该使用原语还是对象?_Java_Primitive - Fatal编程技术网

在Java中,实体和模型应该使用原语还是对象?

在Java中,实体和模型应该使用原语还是对象?,java,primitive,Java,Primitive,作为Java初学者,我在实体类或模型类中选择变量类型时感到困惑。如前所述,它们都有一些优点和缺点,例如内存使用。但是,我想知道创建实体或模型类时的一般方法。所以,在这种情况下,对于long、boolean、int等变量,我应该选择原语还是对象类型,如下所示 public class Student { private Long id; // long ? private String name; private Boolean isGra

作为Java初学者,我在实体类或模型类中选择变量类型时感到困惑。如前所述,它们都有一些优点和缺点,例如内存使用。但是,我想知道创建实体或模型类时的一般方法。所以,在这种情况下,对于long、boolean、int等变量,我应该选择原语还是对象类型,如下所示

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
变量LongInteger的默认值为null

但是longint的默认值是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