Java支持结构吗?

Dmi*_*try 77 java data-structures

Java是否具有C++的模拟struct:

struct Member {
  string FirstName; 
  string LastName;  
  int BirthYear; 
};
Run Code Online (Sandbox Code Playgroud)

我需要使用自己的数据类型.

Tom*_*don 83

Java中的等价物与结构相同

class Member
{
    public String FirstName; 
    public String LastName;  
    public int    BirthYear; 
 };
Run Code Online (Sandbox Code Playgroud)

在适当的情况下,这并没有错.当你使用带有封装数据的类时,你在何时使用struct verses方面与C++中的实际情况大致相同.

  • 我会在Java中使用"POD"类型的类,就像在C++中一样.在J2EE中,您会想到一个"值对象",您可以使用一次返回多个值的方法.使用getter和setter方法封装数据没有意义,只需将字段公开 - 更短,更具描述性.我倾向于封装的任何"正确的",就像我在C++中所做的那样.所以我坚持原来的评论,但这是一种风格选择.我认为你没有放松任何东西,事实上,当你所拥有的是价值等级时,我认为它更具描述性. (22认同)
  • 无需使用分号结束java中的类. (13认同)
  • 如果我错了,请纠正我,但结构的要点是它是通过值而不是通过引用传递的.类总是通过引用传递.这就是为什么这个答案是错误的. (9认同)
  • @PabloAriel我也不同意我之前的评论.我的想法被允许发展超过7年;) (3认同)
  • @ULazdins:我认为你把C#结构与C++结构混淆了.当您将类传递给C++中的方法时,它会调用复制构造函数,默认情况下复制每个字段.您必须明确使用语法通过引用传递它. (2认同)

Hei*_*upp 45

Java肯定没有结构:)但你在这里描述的看起来像JavaBean类.

  • 嗯,只有公共变量的类看起来非常像一个结构. (24认同)
  • 在这个答案 9 年后,我们将在 Java 14 中拥有[记录](https://openjdk.java.net/jeps/359)。时间过得真快,真是有趣。 (16认同)
  • 类和结构之间的主要区别之一是它们在内存中的行为方式。从这方面来说,这个答案是错误的。Java 没有任何行为类似于结构的东西,但希望在不久的将来的某个时候会有“内联类”,我相信它更像是一个结构。 (4认同)

Vla*_*cea 28

Java 14 添加了对 Records 的支持,这是一种非常容易构建的结构化数据类型。

您可以像这样声明一个 Java 记录:

public record AuditInfo(
    LocalDateTime createdOn,
    String createdBy,
    LocalDateTime updatedOn,
    String updatedBy
) {}
 
public record PostInfo(
    Long id,
    String title,
    AuditInfo auditInfo
) {}
Run Code Online (Sandbox Code Playgroud)

而且,Java 编译器将生成以下与AuditInfoRecord关联的 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 */ }
}
Run Code Online (Sandbox Code Playgroud)

请注意,构造函数,访问方法,以及equalshashCodetoString为您创建,所以它是使用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"
    )
);
Run Code Online (Sandbox Code Playgroud)

  • 这首先完全绕过了结构的整个点(不需要“分配”并且可以直接存在于堆栈中而无需引用的复合数据类型。)请参阅此答案https://stackoverflow.com/a/ 57643471/9317690 关于即将到来的“内联课程”。 (6认同)

Eug*_*sev 14

Java没有类似于C++的结构,但你可以使用所有公共成员的类.

  • 实际上,C++中的`struct`是([几乎](http://en.wikipedia.org/wiki/C%2B%2B_classes#Differences_between_struct_and_classes_in_C.2B.2B))与C++中的`class`相同. (15认同)

gan*_*lam 11

是的,Java 还没有结构/值类型。但是,在即将发布的 Java 版本中,我们将获得inline class与 C# 中的 struct 类似的内容,并将帮助我们编写无分配代码。


inline class point { 
  int x;
  int y;
}

Run Code Online (Sandbox Code Playgroud)


小智 9

实际上C++中的结构是一个类(例如,您可以在那里定义方法,它可以扩展,它的工作方式与类完全相同),唯一的区别是默认访问修改器设置为public(对于它们设置为private的类)默认情况下).

这真的是C++的唯一区别,很多人都不知道.; )


小智 8

使用 Project JUnion,您可以通过使用 @Struct 批注对类进行批注来使用 Java 中的结构

@Struct
class Member {
  string FirstName; 
  string LastName;  
  int BirthYear; 
}
Run Code Online (Sandbox Code Playgroud)

项目网站上的更多信息:https : //tehleo.github.io/junion/


Mar*_*kus 6

是的,课程就是你需要的.类定义自己的类型.