Czy Java ma odpowiednik C ++ struct
:
struct Member {
string FirstName;
string LastName;
int BirthYear;
};
Muszę użyć własnego typu danych.
Odpowiedzi:
Java definitywnie nie ma struktur :) Ale to, co tu opisujesz, wygląda jak klasa JavaBean.
inline class
w najbliższej przyszłości będzie miało to, co moim zdaniem bardziej przypomina strukturę.
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.
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. ; )
Java nie ma analogii do struktur C ++, ale możesz używać klas ze wszystkimi publicznymi składnikami.
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 null
odniesień). Zawsze używaj minimalnej widoczności!
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/
Tak, Java nie ma jeszcze typu struktury / wartości. Ale w nadchodzącej wersji Java otrzymamy coś, inline class
co jest podobne do struktury w C # i pomoże nam napisać kod bez alokacji.
inline class point {
int x;
int y;
}
Struktury „naprawdę” czyste nie są obsługiwane w Javie. Na przykład C # obsługuje struct
definicje, 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.
Wraz z Javą 14 zaczyna wspierać Record. Możesz sprawdzić, czy https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Record.html
Są też klasy zapieczętowane po Javie 15. https://openjdk.java.net/jeps/360
firstName
,lastName
ibirthYear
(lubyearOfBirth
oczywiście).