Java支持结构吗? java有一个模拟C+++代码>结构> :< /p> struct Member { string FirstName; string LastName; int BirthYear; };
我需要使用自己的数据类型。Java确实没有结构:)Java支持结构吗? java有一个模拟C+++代码>结构> :< /p> struct Member { string FirstName; string LastName; int BirthYear; };,java,data-structures,Java,Data Structures,我需要使用自己的数据类型。Java确实没有结构:) 但是您在这里描述的看起来像是JavaBean类的类。Java没有类似于C++的结构,但是您可以对所有公共成员使用类。是的,类就是您所需要的。类定义自己的类型。在Java中,与结构等价的是 class Member { public String FirstName; public String LastName; public int BirthYear; }; 在正确的情况下,这没有什么错。与C++相
但是您在这里描述的看起来像是JavaBean类的类。Java没有类似于C++的结构,但是您可以对所有公共成员使用类。是的,类就是您所需要的。类定义自己的类型。在Java中,与结构等价的是
class Member
{
public String FirstName;
public String LastName;
public int BirthYear;
};
在正确的情况下,这没有什么错。与C++相比,在使用一个封装数据的类时,使用什么时候是非常类似的。 < P>实际上C++中的一个结构是一个类(例如,你可以在其中定义方法,它可以被扩展,它的工作方式与类完全一样),唯一的区别是默认访问调制解调器被设置为公共的。(对于类,它们默认设置为private) <>这是C++中唯一的差别,很多人不知道。)java中不支持结构“真”纯。例如,C#支持表示值并可随时分配的
struct
定义
在爪哇中,获得C++结构近似值的独特方法
struct Token
{
TokenType type;
Stringp stringValue;
double mathValue;
}
// Instantiation
{
Token t = new Token;
}
如果不使用(静态缓冲区或列表),则执行如下操作
var type = /* TokenType */ ;
var stringValue = /* String */ ;
var mathValue = /* double */ ;
因此,只需分配变量或静态地将它们定义到一个类中。对于JUniton项目,您可以通过使用@Struct annotation注释类来使用Java中的Struct
@Struct
class Member {
string FirstName;
string LastName;
int BirthYear;
}
项目网站上的更多信息:是的,Java还没有结构/值类型。但是,在即将发布的Java版本中,我们将得到
内联类
,它类似于C#中的struct,并将帮助我们编写无分配代码
inline class point {
int x;
int y;
}
与Java14一起,它开始支持Record。你可以检查一下 Java15之后还有密封类。
Java14增加了对记录的支持,这些记录是非常容易构建的结构化数据类型 您可以这样声明Java记录:
public record AuditInfo(
LocalDateTime createdOn,
String createdBy,
LocalDateTime updatedOn,
String updatedBy
) {}
public record PostInfo(
Long id,
String title,
AuditInfo auditInfo
) {}
而且,Java编译器将生成与AuditInfo
记录关联的以下Java类:
public final class PostInfo
extends java.lang.Record {
private final java.lang.Long id;
private final java.lang.String title;
private final AuditInfo auditInfo;
public PostInfo(
java.lang.Long id,
java.lang.String title,
AuditInfo auditInfo) {
/* compiled code */
}
public java.lang.String toString() { /* compiled code */ }
public final int hashCode() { /* compiled code */ }
public final boolean equals(java.lang.Object o) { /* compiled code */ }
public java.lang.Long id() { /* compiled code */ }
public java.lang.String title() { /* compiled code */ }
public AuditInfo auditInfo() { /* compiled code */ }
}
public final class AuditInfo
extends java.lang.Record {
private final java.time.LocalDateTime createdOn;
private final java.lang.String createdBy;
private final java.time.LocalDateTime updatedOn;
private final java.lang.String updatedBy;
public AuditInfo(
java.time.LocalDateTime createdOn,
java.lang.String createdBy,
java.time.LocalDateTime updatedOn,
java.lang.String updatedBy) {
/* compiled code */
}
public java.lang.String toString() { /* compiled code */ }
public final int hashCode() { /* compiled code */ }
public final boolean equals(java.lang.Object o) { /* compiled code */ }
public java.time.LocalDateTime createdOn() { /* compiled code */ }
public java.lang.String createdBy() { /* compiled code */ }
public java.time.LocalDateTime updatedOn() { /* compiled code */ }
public java.lang.String updatedBy() { /* compiled code */ }
}
请注意,构造函数、访问器方法以及equals
、hashCode
和toString
都是为您创建的,因此使用Java记录非常方便
可以像创建任何其他Java对象一样创建Java记录:
PostInfo postInfo = new PostInfo(
1L,
"High-Performance Java Persistence",
new AuditInfo(
LocalDateTime.of(2016, 11, 2, 12, 0, 0),
"Vlad Mihalcea",
LocalDateTime.now(),
"Vlad Mihalcea"
)
);
简短的回答是:不 答案很长:
类
和结构
(在C++中)之间的主要区别在于,结构中的所有属性都是公共的
,可以从任何地方访问。对于类
,您可以使用不同的隐私级别
对其进行限制好吧,一个只有公共变量的类看起来非常像一个stuct。在Java14中,我们将有9年的时间。有趣的是,时间过得真快。类和结构之间的主要区别之一是它们在内存中的行为。在这方面,这个答案是错误的。Java没有任何行为类似于结构的东西,但希望在不久的将来有
内联类
,我相信这更像是结构。bean有属性(即getter和setter)现在通常注释它是为了符合bean的要求。实际上,C++中的public
中提到这个问题的全部原因是,您可能不想向许多类公开一个容易处于错误状态的记录;最好将其保存在内部。注意,java记录,如所提到的是不可变的(但是,您总是可以使用工厂方法来创建新记录)当然,我将在java中使用与C++一样的“POD”类类。在J2EE中,您会想到“值对象”,其中有一个方法可以同时返回多个值。用getter和setter方法封装数据毫无意义,只需将字段公开即可——更短、更具描述性。任何“适当”的东西我都倾向于封装,在C++中也是如此。所以我坚持我最初的评论,但这是一种风格选择。我不认为你会失去任何东西,事实上,我认为当你得到的是一个值类时,它更具描述性。不需要在java中用分号结束一个类。如果我错了,请纠正我,但Struct的要点是它是通过值传递的,而不是通过引用传递的。类始终通过引用传递。这就是为什么这个答案是错误的。@乌拉辛丁:我想你把C结构与C++结构混淆了。当将类传递给C++中的方法时,它调用复制构造函数,默认构造函数复制每个字段。您必须显式地使用语法通过引用传递它。@PabloAriel我也不同意我先前的评论。我的思维可以在7年内进化;)对于那些过于严格复制的人:Java中的字段确实需要以小写字符开头,所以firstName
、lastName
和生日
(当然也可以是出生年份
)。好东西。我现在了解了结构(对象)是如何被表示的
public final class PostInfo
extends java.lang.Record {
private final java.lang.Long id;
private final java.lang.String title;
private final AuditInfo auditInfo;
public PostInfo(
java.lang.Long id,
java.lang.String title,
AuditInfo auditInfo) {
/* compiled code */
}
public java.lang.String toString() { /* compiled code */ }
public final int hashCode() { /* compiled code */ }
public final boolean equals(java.lang.Object o) { /* compiled code */ }
public java.lang.Long id() { /* compiled code */ }
public java.lang.String title() { /* compiled code */ }
public AuditInfo auditInfo() { /* compiled code */ }
}
public final class AuditInfo
extends java.lang.Record {
private final java.time.LocalDateTime createdOn;
private final java.lang.String createdBy;
private final java.time.LocalDateTime updatedOn;
private final java.lang.String updatedBy;
public AuditInfo(
java.time.LocalDateTime createdOn,
java.lang.String createdBy,
java.time.LocalDateTime updatedOn,
java.lang.String updatedBy) {
/* compiled code */
}
public java.lang.String toString() { /* compiled code */ }
public final int hashCode() { /* compiled code */ }
public final boolean equals(java.lang.Object o) { /* compiled code */ }
public java.time.LocalDateTime createdOn() { /* compiled code */ }
public java.lang.String createdBy() { /* compiled code */ }
public java.time.LocalDateTime updatedOn() { /* compiled code */ }
public java.lang.String updatedBy() { /* compiled code */ }
}
PostInfo postInfo = new PostInfo(
1L,
"High-Performance Java Persistence",
new AuditInfo(
LocalDateTime.of(2016, 11, 2, 12, 0, 0),
"Vlad Mihalcea",
LocalDateTime.now(),
"Vlad Mihalcea"
)
);