Чи підтримує Java структури?


92

Чи має Java аналог C ++ struct:

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

Мені потрібно використовувати власний тип даних.


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

Відповіді:


52

Java остаточно не має конструкцій :) Але те, що ви тут описуєте, виглядає як клас JavaBean.


30
Ну, клас із лише загальнодоступними змінними надзвичайно схожий на штуку.
— mglauche 02.03.11

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, де у вас є метод, який повертає кілька значень одночасно. Немає сенсу інкапсулювати дані методами getter та setter, просто зробіть поля загальнодоступними - коротшими та більш описовими. Що-небудь "належне" я, як правило, інкапсулюю, те саме, що я робив у C ++. Тож я дотримуюсь свого оригінального коментаря, але це вибір стилю. Я не думаю, що ви щось втрачаєте, і справді, я думаю, що це більш наочно, коли те, що у вас є, - це клас цінності.
— Том Кварендон 03.03.11

16
Не потрібно закінчувати клас у Java крапкою з комою.
— Шеф-фараон

14
Виправте мене, якщо я помиляюся, але суть Struct полягає в тому, що він передається за значенням, а не за посиланням. Заняття завжди проходять за посиланням. Тому ця відповідь неправильна.
— ULazdins

4
@ULazdins: Я думаю, ви плутаєте структури C # зі структурами C ++. Коли ви передаєте клас методу в C ++, він викликає конструктор копіювання, який за замовчуванням копіює кожне поле. Ви повинні явно використовувати синтаксис, щоб передати його за посиланням.
— Роналду Назарея

4
@PabloAriel Я б також не погодився зі своїм попереднім коментарем. Моєму мисленню дозволено еволюціонувати протягом 7 років;)
— Майкл Беррі

16

Насправді структура в C ++ - це клас (наприклад, ви можете визначити там методи, його можна розширити, він працює точно так само, як клас), єдина різниця полягає в тому, що за замовчуванням модіфікатори доступу встановлені як public (для класів вони встановлюються як private за замовчуванням).

Це насправді єдина різниця в C ++, багато людей цього не знають. ; )


14

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


15
Насправді a structв C ++ - це ( майже ) те саме, що і classв C ++.
— Йоахім Зауер,

Чому ці члени повинні бути public, чому б просто не приховувати їх як мінімум як мінімум? Такі класи, як правило, не придатні для використання в API (якщо тільки для можливих nullпосилань). Завжди використовуйте мінімальну видимість!
— Маартен Бодеус

8

За допомогою Project JUnion ви можете використовувати структури в Java, анотуючи клас за допомогою анотації @Struct

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

Більше інформації на веб-сайті проекту: https://tehleo.github.io/junion/


Хороший матеріал. Тепер я розумію, як структури (об'єкти) представляються в пам'яті. Дякую людині :)
— user218046

6

Так, клас - це те, що вам потрібно. Клас визначає власний тип.


5

Так, Java ще не має типу struct / value. Але в майбутній версії 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 */ ;

Отже, просто виділіть змінні або статично визначте їх у клас.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.