¿Java admite estructuras?

93

¿Java tiene un análogo de C ++ struct:

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

Necesito usar mi propio tipo de datos.

Dmitry
fuente
Para aquellos que copian demasiado literalmente: los campos en Java realmente necesitan comenzar con un carácter en minúscula, entonces firstName, lastNamey birthYear(o yearOfBirthpor supuesto).
Maarten Bodewes

Respuestas:

52

Java definitivamente no tiene estructuras :) Pero lo que describe aquí parece una clase de clase JavaBean.

Heiko Rupp
fuente
30
Bueno, una clase con solo variables públicas se parece terriblemente a un estudio.
mglauche
10
Tendremos registros 9 años después de esta respuesta, en Java 14. Es divertido lo rápido que pasa el tiempo.
George Leung
Una de las principales diferencias entre clases y estructuras es cómo se comportan en la memoria. En este sentido, esta respuesta es incorrecta. Java no tiene nada que se comporte como una estructura, pero con suerte lo tendrá inline classen algún momento en el futuro cercano que creo que es más como una estructura.
Will Calderwood
Un frijol tiene propiedades (es decir, captadores y usualmente establecedores) y hoy en día comúnmente se anota para que cumpla con los requisitos de un frijol.
Maarten Bodewes
88

El equivalente en Java a una estructura sería

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

y no hay nada de malo en eso en las circunstancias adecuadas. Al igual que en C ++, realmente en términos de cuándo usa struct versos, cuándo usa una clase con datos encapsulados.

Tom Quarendon
fuente
22
Usaría clases de tipo "POD" en Java en las mismas circunstancias que en C ++. Los "objetos de valor" vienen a la mente en J2EE, donde tiene un método que devuelve múltiples valores a la vez. No tiene sentido encapsular los datos con métodos getter y setter, simplemente haga que los campos sean públicos, más cortos y más descriptivos. Cualquier cosa "apropiada" que tiendo a encapsular, al igual que lo hago en C ++. Así que mantengo mi comentario original, pero es una elección de estilo. No creo que pierdas nada, y de hecho creo que es más descriptivo cuando lo que tienes es una clase de valor.
Tom Quarendon
16
No es necesario finalizar una clase en Java con un punto y coma.
Chef Pharaoh
14
Corrígeme si me equivoco, pero el punto de Struct es que se pasa por valor, no por referencia. Las clases siempre se pasan por referencia. Por eso esta respuesta es incorrecta.
ULazdins
4
@ULazdins: Creo que estás confundiendo estructuras C # con estructuras C ++. Cuando pasa una clase a un método en C ++, llama al constructor de copia, que por defecto copia cada campo. Tienes que usar explícitamente la sintaxis para pasarla por referencia.
Ronaldo Nazarea
4
@PabloAriel También estaría en desacuerdo con mi comentario anterior. Mi pensamiento puede evolucionar durante 7 años;)
Michael Berry
16

En realidad, una estructura en C ++ es una clase (por ejemplo, puede definir métodos allí, puede extenderse, funciona exactamente como una clase), la única diferencia es que los modificadores de acceso predeterminados están configurados como públicos (para las clases, están configurados como privados por defecto).

Esta es realmente la única diferencia en C ++, mucha gente no lo sabe. ; )

Damian Wojakowski
fuente
14

Java no tiene un análogo a las estructuras de C ++, pero puede usar clases con todos los miembros públicos.

Eugene Burtsev
fuente
15
En realidad, structen C ++ es (más o menos ) lo mismo que classen C ++.
Joachim Sauer
¿Por qué estos miembros deben serlo public, por qué no mantenerlos dentro del paquete al menos? Clases como esa generalmente no son aptas para su uso en una API (aunque solo sea por las posibles nullreferencias). ¡Utilice siempre la visibilidad mínima!
Maarten Bodewes
8

Con Project JUnion puedes usar estructuras en Java anotando una clase con la anotación @Struct

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

Más información en el sitio web del proyecto: https://tehleo.github.io/junion/

León
fuente
Buen material. Ahora entiendo cómo se representan las estructuras (objetos) en la memoria. Gracias hombre :)
user218046
6

Sí, una clase es lo que necesitas. Una clase define un tipo propio.

Markus
fuente
6

Sí, Java aún no tiene el tipo de estructura / valor. Pero, en la próxima versión de Java, obtendremos inline classuna estructura similar a la de C # y nos ayudará a escribir código libre de asignación.


inline class point { 
  int x;
  int y;
}

ganesan arunachalam
fuente
2

Las estructuras "realmente" puras no son compatibles con Java. Por ejemplo, C # admite structdefiniciones que representan valores y se pueden asignar en cualquier momento.

En Java, la forma única de obtener una aproximación de las estructuras de C ++

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

// Instantiation

{
    Token t = new Token;
}

sin usar un (búfer estático o lista) está haciendo algo como

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

Entonces, simplemente asigne variables o defínelas estáticamente en una clase.

Diva
fuente