Java supporta le strutture?


93

Java ha un analogo di un C ++ struct:

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

Devo usare il mio tipo di dati.


Per coloro che copiano troppo alla lettera: i campi in Java devono davvero iniziare con un carattere minuscolo, quindi firstName, lastNamee birthYear(o yearOfBirthovviamente).
Maarten Bodewes

Risposte:


52

Java definitivamente non ha strutture :) Ma quello che descrivi qui sembra un tipo di classe JavaBean.


30
Bene, una classe con solo variabili pubbliche sembra terribilmente come uno stuct.
mglauche

10
Avremo record 9 anni dopo questa risposta, in Java 14. È divertente come il tempo vola velocemente.
George Leung,

Una delle principali differenze tra classi e strutture è il modo in cui si comportano in memoria. A questo proposito, questa risposta è sbagliata. Java non ha nulla che si comporti come una struttura, ma si spera che inline classad un certo punto nel prossimo futuro, credo sia più simile a una struttura.
Will Calderwood il

Un bean ha proprietà (cioè getter e solitamente setter) e oggigiorno viene comunemente annotato per essere conforme ai requisiti per un bean.
Maarten Bodewes

88

L'equivalente in Java di una struttura sarebbe

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

e non c'è niente di sbagliato in questo nelle giuste circostanze. Più o meno lo stesso che in C ++ in termini di quando usi gli struct verses quando usi una classe con dati incapsulati.


22
Vorrei usare le classi di tipo "POD" in java nelle stesse circostanze che uso in C ++. Gli "oggetti valore" vengono in mente in J2EE in cui si dispone di un metodo che restituisce più valori contemporaneamente. Non ha senso incapsulare i dati con metodi getter e setter, basta rendere pubblici i campi - più brevi e più descrittivi. Qualunque cosa "corretta" tendo a incapsulare, lo stesso lo faccio in C ++. Quindi rimango sul mio commento originale, ma è una scelta di stile. Non credo che tu perda nulla, e in effetti penso che sia più descrittivo quando quello che hai è una classe di valore.
Tom Quarendon

16
Non c'è bisogno di terminare una lezione in Java con un punto e virgola.
Chef Pharaoh

14
Correggimi se sbaglio, ma il punto di Struct è che viene passato per valore non per riferimento. Le classi vengono sempre passate per riferimento. Ecco perché questa risposta è sbagliata.
ULazdins

4
@ULazdins: Penso che tu stia confondendo le strutture C # con le strutture C ++. Quando si passa una classe a un metodo in C ++, viene chiamato il costruttore di copia, che per impostazione predefinita copia ogni campo. Devi usare esplicitamente la sintassi per passarla per riferimento.
Ronaldo Nazarea

4
@ PabloAriel Anche io non sono d'accordo con il mio commento precedente. Il mio pensiero può evolversi in 7 anni;)
Michael Berry

16

In realtà una struttura in C ++èuna classe (ad esempio puoi definire metodi lì, può essere estesa, funziona esattamente come una classe), l'unica differenza è che i modificatori di accesso predefiniti sono impostati come pubblici (per le classi sono impostati come privati per impostazione predefinita).

Questa è davvero l'unica differenza in C ++, molte persone non lo sanno. ; )


14

Java non ha un analogo alle strutture di C ++, ma puoi usare classi con tutti i membri pubblici.


15
In realtà a structin C ++ è ( praticamente ) la stessa cosa di a classin C ++.
Joachim Sauer

Perché questi membri devono esserlo public, perché non mantenerli come minimo interni al pacchetto? Classi del genere non sono generalmente adatte per l'uso in un'API (se non altro per i possibili nullriferimenti). Usa sempre la visibilità minima!
Maarten Bodewes

8

Con Project JUnion puoi usare le strutture in Java annotando una classe con l'annotazione @Struct

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

Maggiori informazioni sul sito web del progetto: https://tehleo.github.io/junion/


Roba buona. Ora capisco come le strutture (oggetti) sono rappresentate nella memoria. Grazie amico :)
user218046

6

Sì, una lezione è ciò di cui hai bisogno. Una classe definisce un proprio tipo.


6

Sì, Java non ha ancora il tipo di struttura / valore. Ma, nella prossima versione di Java, otterremo inline classche è simile a struct in C # e ci aiuterà a scrivere codice senza allocazione.


inline class point { 
  int x;
  int y;
}


2

Le strutture "veramente" pure non sono supportate in Java. Ad esempio, C # supporta structdefinizioni che rappresentano valori e possono essere allocati in qualsiasi momento.

In Java, il modo unico per ottenere un'approssimazione delle strutture C ++

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

// Instantiation

{
    Token t = new Token;
}

senza usare un (buffer statico o elenco) sta facendo qualcosa di simile

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

Quindi, alloca semplicemente le variabili o definiscile staticamente in una classe.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.