Чи підтримує 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.