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.


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.


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.


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


14

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


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/


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.


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;
}


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.


0

Avec Java 14, il prend en charge Record. Vous voudrez peut-être vérifier que https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Record.html

Et il y a des classes scellées après Java 15. https://openjdk.java.net/jeps/360


Pouvez-vous donner un exemple d'enregistrement?
Scratte

Veuillez ne pas simplement publier un outil ou une bibliothèque comme réponse. Démontrez au moins comment cela résout le problème dans la réponse elle-même.
Yatin il y a
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.