Поддерживает ли 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


Можете ли вы привести пример записи?
Scratte

Пожалуйста, не публикуйте в ответ какой-нибудь инструмент или библиотеку. По крайней мере, в самом ответе продемонстрируйте, как он решает проблему .
Ятин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.