Does Java-ondersteuning structuren?

Heeft Java een analoog van een C++ struct:

struct Member {
  string FirstName; 
  string LastName;  
  int BirthYear; 
};

Ik moet mijn eigen gegevenstype gebruiken.


1, Autoriteit 100%

Java heeft absoluut geen structuren 🙂
Maar wat je hier beschrijft, ziet eruit als een JavaBean-soort klasse.


2, Autoriteit 160%

Het equivalent in Java tot een structuur zou

zijn

class Member
{
    public String FirstName; 
    public String LastName;  
    public int    BirthYear; 
 };

En er is niets mis mee in de juiste omstandigheden. Veel hetzelfde als in C++ echt in termen van wanneer gebruik je struct-verzen wanneer gebruik je een klasse met ingekapselde gegevens.


3, Autoriteit 44%

Java 14 heeft ondersteuning toegevoegd voor records, die gestructureerde gegevenstypen zijn die zeer eenvoudig te bouwen zijn.

U kunt als volgt een Java-record declareren:

public record AuditInfo(
    LocalDateTime createdOn,
    String createdBy,
    LocalDateTime updatedOn,
    String updatedBy
) {}
public record PostInfo(
    Long id,
    String title,
    AuditInfo auditInfo
) {}

En de Java-compiler genereert de volgende Java-klasse die is gekoppeld aan de AuditInfoRecord:

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 */ }
}

Merk op dat de constructor, accessor-methoden, evenals equals, hashCodeen toStringvoor u zijn gemaakt, dus het is erg handig om Java Records te gebruiken.

Een Java-record kan worden gemaakt zoals elk ander Java-object:

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"
    )
);

4, Autoriteit 32%

Eigenlijk een struct in C++ is een klasse (bijvoorbeeld U kunt hier methoden definiëren, het kan worden uitgebreid, het werkt precies zoals een klasse), het enige verschil is dat de standaard toegangsmodfiers zijn ingesteld op het openbaar (voor klassen die ze zijn Standaard ingesteld op privé).

Dit is echt het enige verschil in C++, veel mensen weten dat niet. ; )


5, Autoriteit 26%

Java heeft geen analoog aan C++’s -structies, maar u kunt lessen gebruiken met alle openbare leden.


6, Autoriteit 18%

Ja, Java heeft nog geen struct / value-type. Maar in de aankomende versie van Java gaan we inline classdie vergelijkbaar is met Struct in C # en ons helpt ons toewijzingsvrije code te schrijven.


inline class point { 
  int x;
  int y;
}

7, Autoriteit 13%

Met Project Junion kunt u structuren in Java gebruiken door een klasse met annotatie annotatie te annoteren

@Struct
class Member {
  string FirstName; 
  string LastName;  
  int BirthYear; 
}

Meer info op de website van het project: https://tehleo.github.io/junion/


8, Autoriteit 8%

Ja, een klas is wat je nodig hebt. Een klasse definieert een eigen type.


9, Autoriteit 3%

Structeert “Echt” zuiver worden niet ondersteund in Java. B.v. C # ondersteunt structdefinities die waarden vertegenwoordigen en op elk moment kunnen worden toegewezen.

In Java, de unieke manier om een ​​benadering van C++ -structies

te halen

struct Token
{
    TokenType type;
    Stringp stringValue;
    double mathValue;
}
// Instantiation
{
    Token t = new Token;
}

zonder gebruik te maken van een (statische buffer of lijst) doet zoiets als

var type = /* TokenType */ ;
var stringValue = /* String */ ;
var mathValue = /* double */ ;

Dus, wijs eenvoudig variabelen toe of definieer ze statisch in een klasse.


Antwoord 10, autoriteit 2%

Samen met Java 14 begint het Record te ondersteunen. Misschien wilt u controleren dat https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Record.html

public record Person (String name, String address) {}
Person person = new Person("Esteban", "Stormhaven, Tamriel");

En er zijn verzegelde klassen na Java 15.
https://openjdk.java.net/jeps/360

sealed interface Shape permits Circle, Rectangle {
  record Circle(Point center, int radius) implements Shape { }
  record Rectangle(Point lowerLeft, Point upperRight) implements Shape { } 
}

Other episodes