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.


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.


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.


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. ; )


14

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


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/


Dobry towar. Teraz rozumiem, jak struktury (obiekty) są przedstawiane w pamięci. Dzięki stary :)
user218046


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;
}


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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.