Поддерживает ли Java структуры?

93

Есть ли в Java аналог C ++ struct:

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

Мне нужно использовать свой собственный тип данных.

Дмитрий
источник
Для тех , копирование слишком буквально: поля в Java действительно нужно начинать со строчной характер, так firstName, lastNameи birthYear(или yearOfBirthконечно).
Маартен Бодевес,

Ответы:

52

В Java определенно нет структур :) Но то, что вы здесь описываете, похоже на класс JavaBean.

Хайко Рупп
источник
30
Ну, класс только с общедоступными переменными ужасно похож на штуку.
mglauche 02
10
Через 9 лет после этого ответа у нас будут записи на Java 14. Забавно, как быстро время летит.
Джордж Люн,
Одно из основных различий между классами и структурами - это их поведение в памяти. В этом отношении этот ответ неверен. В Java нет ничего, что ведет себя как структура, но, надеюсь, inline classв какой-то момент в ближайшем будущем она будет больше похожа на структуру.
Уилл Колдервуд
Бин имеет свойства (то есть геттеры и обычно сеттеры), и в настоящее время обычно аннотируется, чтобы он соответствовал требованиям к компоненту.
Маартен Бодевес,
88

Эквивалент структуры в Java будет

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

и нет ничего плохого в этом при правильных обстоятельствах. Во многом то же самое, что и в C ++, когда вы используете структурные стихи, когда используете класс с инкапсулированными данными.

Том Кварендон
источник
22
Я бы использовал классы типа "POD" в java в тех же обстоятельствах, что и в C ++. «Объекты значений» приходят на ум в J2EE, где у вас есть метод, который возвращает несколько значений одновременно. Нет смысла инкапсулировать данные с помощью методов получения и установки, просто сделайте поля общедоступными - короче и нагляднее. Все «правильное» я стараюсь инкапсулировать так же, как я делаю в C ++. Так что я придерживаюсь своего первоначального комментария, но это выбор стиля. Я не думаю, что вы что-то теряете, и действительно, я думаю, что это более наглядно, когда у вас есть класс ценности.
Tom Quarendon 03
16
Не нужно заканчивать класс в java точкой с запятой.
Chef Pharaoh
14
Поправьте меня, если я ошибаюсь, но суть Struct в том, что он передается по значению, а не по ссылке. Классы всегда передаются по ссылке. Вот почему этот ответ неверен.
ULazdins
4
@ULazdins: Я думаю, вы путаете структуры C # со структурами C ++. Когда вы передаете класс методу в C ++, он вызывает конструктор копирования, который по умолчанию копирует каждое поле. Вы должны явно использовать синтаксис, чтобы передать его по ссылке.
Роналду Назареа
4
@PabloAriel Я также не согласен с моим предыдущим комментарием. Мое мышление может развиваться в течение 7 лет;)
Майкл Берри
16

На самом деле структура в C ++ - это класс (например, вы можете определять там методы, ее можно расширять, она работает точно так же, как класс), единственная разница в том, что модификаторы доступа по умолчанию установлены на public (для классов они установлены как частные по умолчанию).

Это действительно единственное отличие C ++, многие этого не знают. ; )

Дамиан Вояковски
источник
14

Java не имеет аналога структурам C ++, но вы можете использовать классы со всеми общедоступными членами.

Евгений Бурцев
источник
15
На самом деле a structв C ++ ( почти ) то же самое, что a classв C ++.
Joachim Sauer
Зачем нужны эти члены public, почему бы просто не оставить их как минимум внутри пакета? Подобные классы обычно не подходят для использования в API (если только для возможных nullссылок). Всегда используйте минимальную видимость!
Маартен Бодевес,
8

В Project JUnion вы можете использовать структуры в Java, аннотируя класс аннотацией @Struct.

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

Больше информации на сайте проекта: https://tehleo.github.io/junion/

Лео
источник
Хорошая вещь. Теперь я понимаю, как структуры (объекты) представлены в памяти. Спасибо, чувак :)
user218046
6

Да, класс - это то, что вам нужно. Класс определяет собственный тип.

Маркус
источник
6

Да, в Java еще нет типа структура / значение. Но в следующей версии Java мы собираемся получить inline classструктуру, аналогичную структуре в C #, которая поможет нам написать код без выделения памяти.


inline class point { 
  int x;
  int y;
}

Ганешан Аруначалам
источник
2

Структуры "действительно" чистые не поддерживаются в Java. Например, C # поддерживаетstruct определения, которые представляют значения и могут быть выделены в любое время.

В Java - уникальный способ приблизиться к структурам C ++.

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

// Instantiation

{
    Token t = new Token;
}

без использования (статического буфера или списка) делает что-то вроде

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

Итак, просто выделите переменные или статически определите их в класс.

Дива
источник
0

Вместе с Java 14 он начинает поддерживать запись. Вы можете проверить это https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Record.html

И после Java 15 есть запечатанные классы. Https://openjdk.java.net/jeps/360

Orcun
источник
Можете ли вы привести пример записи?
Scratte
Пожалуйста, не публикуйте в ответ какой-нибудь инструмент или библиотеку. По крайней мере, в самом ответе продемонстрируйте, как он решает проблему .
Ятин