Unterstützt Java Strukturen?

90

Hat Java ein Analogon zu einem C ++ struct:

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

Ich muss meinen eigenen Datentyp verwenden.

Dmitry
quelle
Für diejenigen , Kopieren zu wörtlich: Felder in Java müssen wirklich mit einem Kleinbuchstaben beginnen, so firstName, lastNameund birthYear(oder yearOfBirthnatürlich).
Maarten Bodewes

Antworten:

49

Java hat definitiv keine Strukturen :) Aber was Sie hier beschreiben, sieht aus wie eine JavaBean-Klasse.

Heiko Rupp
quelle
29
Nun, eine Klasse mit nur öffentlichen Variablen sieht schrecklich aus wie eine Struktur.
mglauche
8
Wir werden 9 Jahre nach dieser Antwort Aufzeichnungen in Java 14 haben. Es ist amüsant, wie schnell die Zeit vergeht.
George Leung
Einer der Hauptunterschiede zwischen Klassen und Strukturen besteht darin, wie sie sich im Speicher verhalten. In dieser Hinsicht ist diese Antwort falsch. Java hat nichts, was sich wie eine Struktur verhält, aber hoffentlich inline classirgendwann in naher Zukunft, was meiner Meinung nach eher wie eine Struktur ist.
Will Calderwood
Eine Bohne hat Eigenschaften (dh Getter und normalerweise Setter) und wird heutzutage häufig mit Anmerkungen versehen, damit sie den Anforderungen für eine Bohne entspricht.
Maarten Bodewes
84

Das Äquivalent in Java zu einer Struktur wäre

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

und daran ist unter den richtigen Umständen nichts auszusetzen. Ähnlich wie in C ++, wenn Sie Strukturverse verwenden, wenn Sie eine Klasse mit gekapselten Daten verwenden.

Tom Quarendon
quelle
22
Ich würde in Java unter den gleichen Umständen Klassen vom Typ "POD" verwenden wie in C ++. "Wertobjekte" fallen Ihnen in J2EE ein, wo Sie eine Methode haben, die mehrere Werte gleichzeitig zurückgibt. Es macht keinen Sinn, die Daten mit Getter- und Setter-Methoden zu kapseln. Machen Sie einfach die Felder öffentlich - kürzer und aussagekräftiger. Alles, was "richtig" ist, neige ich dazu, es zu kapseln, genauso wie ich es in C ++ getan habe. Ich stehe also zu meinem ursprünglichen Kommentar, aber es ist eine Stilwahl. Ich glaube nicht, dass Sie etwas verlieren, und ich denke, es ist aussagekräftiger, wenn Sie eine Werteklasse haben.
Tom Quarendon
16
Sie müssen eine Klasse in Java nicht mit einem Semikolon beenden.
Chef Pharao
13
Korrigieren Sie mich, wenn ich falsch liege, aber der Punkt von Struct ist, dass es als Wert und nicht als Referenz übergeben wird. Klassen werden immer als Referenz übergeben. Deshalb ist diese Antwort falsch.
ULazdins
3
@ULazdins: Ich denke, Sie verwechseln C # -Strukturen mit C ++ - Strukturen. Wenn Sie eine Klasse an eine Methode in C ++ übergeben, wird der Kopierkonstruktor aufgerufen, der standardmäßig jedes Feld kopiert. Sie müssen die Syntax explizit verwenden, um sie als Referenz zu übergeben.
Ronaldo Nazarea
4
@PabloAriel Ich würde auch meinem früheren Kommentar nicht zustimmen. Mein Denken darf sich über 7 Jahre entwickeln;)
Michael Berry
14

Java hat kein Analogon zu den Strukturen von C ++, aber Sie können Klassen mit allen öffentlichen Mitgliedern verwenden.

Eugene Burtsev
quelle
15
Eigentlich ist ein structin C ++ (so ziemlich ) dasselbe wie ein classin C ++.
Joachim Sauer
Warum müssen diese Mitglieder sein public, warum sollten sie nicht zumindest zumindest im Paket enthalten bleiben? Solche Klassen sind im Allgemeinen nicht für die Verwendung in einer API geeignet (wenn auch nur für die möglichen nullReferenzen). Verwenden Sie immer die minimale Sichtbarkeit!
Maarten Bodewes
13

Tatsächlich ist eine Struktur in C ++ eine Klasse (z. B. können Sie dort Methoden definieren, sie kann erweitert werden, sie funktioniert genau wie eine Klasse). Der einzige Unterschied besteht darin, dass die Standardzugriffsmodifikatoren auf public festgelegt sind (für Klassen auf private standardmäßig).

Dies ist wirklich der einzige Unterschied in C ++, viele Leute wissen das nicht. ;; )

Damian Wojakowski
quelle
8

Mit Project JUnion können Sie Strukturen in Java verwenden, indem Sie eine Klasse mit der Annotation @Struct versehen

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

Weitere Informationen finden Sie auf der Website des Projekts: https://tehleo.github.io/junion/

Löwe
quelle
6

Ja, eine Klasse ist das, was Sie brauchen. Eine Klasse definiert einen eigenen Typ.

Markus
quelle
4

Ja, Java hat noch keinen Struktur- / Werttyp. In der kommenden Java-Version werden wir jedoch eine Version erhalten, inline classdie der Struktur in C # ähnelt und uns dabei helfen wird, zuweisungsfreien Code zu schreiben.


inline class point { 
  int x;
  int y;
}
Ganesan Arunachalam
quelle
2

Strukturen "wirklich" rein werden in Java nicht unterstützt. Beispielsweise unterstützt C # structDefinitionen, die Werte darstellen und jederzeit zugewiesen werden können.

In Java die einzigartige Möglichkeit, eine Annäherung an C ++ - Strukturen zu erhalten

struct Token
{
    TokenType type;
    Stringp stringValue;
    double mathValue;
}

// Instantiation

{
    Token t = new Token;
}

ohne Verwendung eines (statischen Puffers oder einer Liste) macht so etwas

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

Ordnen Sie also einfach Variablen zu oder definieren Sie sie statisch in einer Klasse.

Diva
quelle