Czy Java obsługuje struktury?

93

Czy Java ma odpowiednik C ++ struct:

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

Muszę użyć własnego typu danych.

Dmitry
źródło
Dla tych, kopiowanie zbyt dosłownie: Pola w Javie naprawdę trzeba zacząć od charakteru małych liter, tak firstName, lastNamei birthYear(lub yearOfBirthoczywiście).
Maarten Bodewes

Odpowiedzi:

52

Java definitywnie nie ma struktur :) Ale to, co tu opisujesz, wygląda jak klasa JavaBean.

Heiko Rupp
źródło
30
Cóż, klasa z tylko zmiennymi publicznymi wygląda okropnie jak struktura.
mglauche
10
Będziemy mieć rekordy 9 lat po tej odpowiedzi, w Javie 14. To zabawne, jak szybko leci czas.
George Leung
Jedną z głównych różnic między klasami i strukturami jest sposób, w jaki zachowują się w pamięci. Pod tym względem ta odpowiedź jest błędna. Java nie ma nic, co zachowywałoby się jak struktura, ale mam nadzieję, że inline classw najbliższej przyszłości będzie miało to, co moim zdaniem bardziej przypomina strukturę.
Will Calderwood
Fasola ma właściwości (tj. Pobierające i zwykle ustawiające) i obecnie powszechnie dodaje się adnotacje, aby spełniało wymagania dotyczące fasoli.
Maarten Bodewes
88

W Javie odpowiednikiem struktury byłoby

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

i nie ma w tym nic złego w odpowiednich okolicznościach. Tak samo jak w C ++, jeśli chodzi o to, kiedy używasz wersetów struct, kiedy używasz klasy z hermetyzowanymi danymi.

Tom Quarendon
źródło
22
Użyłbym klas typu „POD” w Javie w takich samych okolicznościach, jak w C ++. W J2EE przychodzą na myśl „obiekty wartości”, w których istnieje metoda zwracająca wiele wartości jednocześnie. Nie ma sensu hermetyzować danych metodami pobierającymi i ustawiającymi, wystarczy upublicznić pola - krótsze i bardziej opisowe. Wszystko „właściwe”, które zwykle zamykam, podobnie jak w C ++. Tak więc podtrzymuję swój oryginalny komentarz, ale jest to wybór stylu. Nie sądzę, żebyś coś stracił i rzeczywiście uważam, że jest to bardziej opisowe, gdy masz klasę wartości.
Tom Quarendon
16
Nie ma potrzeby kończenia zajęć w Javie średnikiem.
Chef Pharaoh
14
Popraw mnie, jeśli się mylę, ale celem Struct jest to, że jest przekazywany przez wartość, a nie przez odniesienie. Klasy są zawsze przekazywane przez referencje. Dlatego ta odpowiedź jest błędna.
ULazdins
4
@ULazdins: Myślę, że mylisz struktury C # ze strukturami C ++. Kiedy przekazujesz klasę do metody w C ++, wywołuje ona konstruktora kopiującego, który domyślnie kopiuje każde pole. Musisz jawnie użyć składni, aby przekazać ją przez odwołanie.
Ronaldo Nazarea
4
@PabloAriel Też nie zgadzam się z moim wcześniejszym komentarzem. Moje myślenie może ewoluować przez 7 lat;)
Michael Berry
16

Właściwie struktura w C ++ jest klasą (np. Można tam definiować metody, można ją rozszerzać, działa dokładnie jak klasa), jedyną różnicą jest to, że domyślne modyfikatory dostępu są ustawione na publiczne (dla klas są ustawione na prywatne domyślnie).

To naprawdę jedyna różnica w C ++, wiele osób o tym nie wie. ; )

Damian Wojakowski
źródło
14

Java nie ma analogii do struktur C ++, ale możesz używać klas ze wszystkimi publicznymi składnikami.

Eugene Burtsev
źródło
15
Właściwie a structw C ++ jest ( prawie ) tym samym co classw C ++.
Joachim Sauer
Dlaczego ci członkowie muszą być public, dlaczego nie trzymać ich przynajmniej wewnątrz pakietu? Klasy takie jak ta na ogół nie nadają się do użycia w API (choćby dla możliwych nullodniesień). Zawsze używaj minimalnej widoczności!
Maarten Bodewes
8

Dzięki Project JUnion możesz używać struktur w Javie, dodając adnotacje do klasy za pomocą adnotacji @Struct

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

Więcej informacji na stronie projektu: https://tehleo.github.io/junion/

Lew
źródło
Dobry towar. Teraz rozumiem, jak struktury (obiekty) są przedstawiane w pamięci. Dzięki stary :)
user218046
6

Tak, potrzebujesz klasy. Klasa definiuje własny typ.

Markus
źródło
6

Tak, Java nie ma jeszcze typu struktury / wartości. Ale w nadchodzącej wersji Java otrzymamy coś, inline classco jest podobne do struktury w C # i pomoże nam napisać kod bez alokacji.


inline class point { 
  int x;
  int y;
}

ganesan arunachalam
źródło
2

Struktury „naprawdę” czyste nie są obsługiwane w Javie. Na przykład C # obsługuje structdefinicje, które reprezentują wartości i mogą być przydzielane w dowolnym momencie.

W Javie, unikalny sposób uzyskiwania przybliżenia struktur C ++

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

// Instantiation

{
    Token t = new Token;
}

bez użycia (statycznego bufora lub listy) robi coś podobnego

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

Dlatego po prostu przydziel zmienne lub zdefiniuj je statycznie w klasie.

Diwa
źródło