Java prend-il en charge les structures?

93

Java a-t-il un analogue d'un C ++ struct:

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

J'ai besoin d'utiliser mon propre type de données.

Dmitry
la source
Pour ceux qui copient trop littéralement: les champs en Java doivent vraiment commencer par un caractère minuscule, donc firstName, lastNameet birthYear(ou yearOfBirthbien sûr).
Maarten Bodewes

Réponses:

52

Java n'a définitivement pas de structure :) Mais ce que vous décrivez ici ressemble à une classe de type JavaBean.

Heiko Rupp
la source
30
Eh bien, une classe avec uniquement des variables publiques ressemble terriblement à une structure.
mglauche
10
Nous aurons des enregistrements 9 ans après cette réponse, en Java 14. Il est amusant de voir à quelle vitesse le temps passe.
George Leung
L'une des principales différences entre les classes et les structures est la façon dont elles se comportent en mémoire. À cet égard, cette réponse est fausse. Java n'a rien qui se comporte comme une structure mais qui, espérons-le, le fera inline classà un moment donné dans un proche avenir, ce qui, je crois, ressemble plus à une structure.
Will Calderwood le
Un haricot a des propriétés (c'est-à-dire des getters et généralement des décanteurs) et de nos jours il est généralement annoté pour qu'il soit conforme aux exigences d'un haricot.
Maarten Bodewes
88

L'équivalent en Java d'une structure serait

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

et il n'y a rien de mal à cela dans les bonnes circonstances. À peu près la même chose qu'en C ++ en termes de quand utilisez-vous des versets de struct quand utilisez-vous une classe avec des données encapsulées.

Tom Quarendon
la source
22
J'utiliserais des classes de type "POD" en java dans les mêmes circonstances que je le fais en C ++. Les «objets de valeur» viennent à l'esprit dans J2EE où vous avez une méthode qui renvoie plusieurs valeurs à la fois. Inutile d'encapsuler les données avec les méthodes getter et setter, rendez simplement les champs publics - plus courts et plus descriptifs. Tout ce qui est «correct» que j'ai tendance à encapsuler, c'est la même chose que je fais en C ++. Je maintiens donc mon commentaire d'origine, mais c'est un choix de style. Je ne pense pas que vous perdiez quoi que ce soit, et en effet je pense que c'est plus descriptif lorsque vous avez une classe de valeur.
Tom Quarendon
16
Pas besoin de terminer une classe en java par un point-virgule.
Chef Pharaon
14
Corrigez-moi si je me trompe, mais le but de Struct est qu'il est passé par valeur et non par référence. Les classes sont toujours passées par référence. C'est pourquoi cette réponse est fausse.
ULazdins
4
@ULazdins: Je pense que vous confondez les structures C # avec les structures C ++. Lorsque vous passez une classe à une méthode en C ++, elle appelle le constructeur de copie, qui copie par défaut chaque champ. Vous devez utiliser explicitement la syntaxe pour la passer par référence.
Ronaldo Nazarea
4
@PabloAriel Je suis également en désaccord avec mon commentaire précédent. Ma réflexion est autorisée à évoluer sur 7 ans;)
Michael Berry
16

En fait, une structure en C ++ est une classe (par exemple, vous pouvez y définir des méthodes, elle peut être étendue, cela fonctionne exactement comme une classe), la seule différence est que les modfieurs d'accès par défaut sont définis sur public (pour les classes, ils sont définis sur private par défaut).

C'est vraiment la seule différence en C ++, beaucoup de gens ne le savent pas. ; )

Damian Wojakowski
la source
14

Java n'a pas d'analogue aux structures de C ++, mais vous pouvez utiliser des classes avec tous les membres publics.

Eugène Burtsev
la source
15
En fait, un structen C ++ est (à peu près ) la même chose qu'un classen C ++.
Joachim Sauer
Pourquoi ces membres doivent-ils l'être public, pourquoi ne pas les garder au moins à l'intérieur du package? De telles classes ne sont généralement pas adaptées à une utilisation dans une API (ne serait-ce que pour les nullréférences possibles ). Utilisez toujours la visibilité minimale!
Maarten Bodewes
8

Avec Project JUnion, vous pouvez utiliser des structures en Java en annotant une classe avec l'annotation @Struct

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

Plus d'informations sur le site Web du projet: https://tehleo.github.io/junion/

Leo
la source
Bon produit. Je comprends maintenant comment les structures (objets) sont représentées en mémoire. Thanks man :)
user218046
6

Oui, une classe est ce dont vous avez besoin. Une classe définit un propre type.

Markus
la source
6

Oui, Java n'a pas encore de type struct / value. Mais, dans la prochaine version de Java, nous allons obtenir inline classce qui est similaire à struct en C # et nous aidera à écrire du code sans allocation.


inline class point { 
  int x;
  int y;
}

ganesan arunachalam
la source
2

Les structures "vraiment" pures ne sont pas supportées en Java. Par exemple, C # prend en charge les structdéfinitions qui représentent des valeurs et peuvent être allouées à tout moment.

En Java, le moyen unique d'obtenir une approximation des structures C ++

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

// Instantiation

{
    Token t = new Token;
}

sans utiliser de (tampon statique ou liste) fait quelque chose comme

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

Alors, allouez simplement des variables ou définissez-les statiquement dans une classe.

Diva
la source