Apakah Java mendukung struct?

94

Apakah Java memiliki analog dari C ++ struct:

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

Saya perlu menggunakan tipe data saya sendiri.

Dmitry
sumber
Bagi mereka yang menyalin terlalu harfiah: bidang di Java benar-benar harus dimulai dengan karakter huruf kecil, jadi firstName, lastNamedan birthYear(atau yearOfBirthtentu saja).
Maarten Bodewes

Jawaban:

52

Java secara definitif tidak memiliki struct :) Tapi yang Anda gambarkan di sini terlihat seperti jenis kelas JavaBean.

Heiko Rupp
sumber
30
Nah, kelas dengan hanya variabel publik terlihat sangat mirip sebuah tahapan.
mglauche
10
Kami akan memiliki catatan 9 tahun setelah jawaban ini, di Jawa 14. Sungguh lucu betapa cepatnya waktu berlalu.
George Leung
Salah satu perbedaan utama antara kelas dan struct adalah bagaimana mereka berperilaku dalam memori. Dalam hal ini, jawaban ini salah. Java tidak memiliki apa pun yang berperilaku seperti struct tetapi mudah-mudahan akan ada inline classdi beberapa titik dalam waktu dekat yang menurut saya lebih seperti struct.
Akan Calderwood
Kacang memiliki properti (yaitu pengambil dan biasanya penyetel) dan saat ini umumnya diberi anotasi agar memenuhi persyaratan untuk kacang.
Maarten Bodewes
88

Setara di Java dengan struct adalah

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

dan tidak ada yang salah dengan itu dalam situasi yang tepat. Sama seperti di C ++ sebenarnya dalam hal kapan Anda menggunakan ayat struct ketika Anda menggunakan kelas dengan data yang dienkapsulasi.

Tom Quarendon
sumber
22
Saya akan menggunakan kelas tipe "POD" di java dalam situasi yang sama seperti yang saya lakukan di C ++. "Nilai objek" muncul dalam pikiran di J2EE di mana Anda memiliki metode yang mengembalikan beberapa nilai sekaligus. Tidak ada gunanya merangkum data dengan metode pengambil dan penyetel, cukup buat bidang menjadi publik - lebih pendek dan lebih deskriptif. Apa pun yang "tepat" cenderung saya rangkum, sama seperti yang saya lakukan di C ++. Jadi saya mendukung komentar asli saya, tetapi ini adalah pilihan gaya. Saya tidak berpikir Anda kehilangan apa pun, dan memang saya pikir itu lebih deskriptif ketika apa yang Anda miliki adalah kelas nilai.
Tom Quarendon
16
Tidak perlu mengakhiri kelas di java dengan titik koma.
Chef Pharaoh
14
Koreksi saya jika saya salah, tetapi inti dari Struct adalah bahwa ia melewati nilai bukan dengan referensi. Kelas selalu dilalui dengan referensi. Itulah mengapa jawaban ini salah.
ULazdins
4
@ULazdins: Saya pikir Anda membingungkan C # struct dengan C ++ struct. Saat Anda meneruskan kelas ke metode di C ++, ia memanggil konstruktor salinan, yang secara default menyalin setiap bidang. Anda harus secara eksplisit menggunakan sintaks untuk meneruskannya dengan referensi.
Ronaldo Nazarea
4
@PabloAriel Saya juga tidak setuju dengan komentar saya sebelumnya. Pemikiran saya dibiarkan berkembang selama 7 tahun;)
Michael Berry
16

Sebenarnya sebuah struct di C ++ adalah sebuah kelas (misalnya Anda dapat mendefinisikan metode di sana, ia dapat diperpanjang, bekerja persis seperti kelas), satu-satunya perbedaan adalah bahwa pemodifikasi akses default disetel ke publik (untuk kelas mereka disetel ke privat secara default).

Ini benar-benar satu-satunya perbedaan dalam C ++, banyak orang tidak mengetahuinya. ; )

Damian Wojakowski
sumber
14

Java tidak memiliki analog dengan struct C ++, tetapi Anda dapat menggunakan kelas dengan semua anggota publik.

Eugene Burtsev
sumber
15
Sebenarnya a structdi C ++ ( hampir ) sama dengan a classdi C ++.
Joachim Sauer
Mengapa anggota ini perlu public, mengapa tidak menyimpannya di dalam paket paling tidak? Kelas seperti itu umumnya tidak cocok untuk digunakan dalam API (jika hanya untuk nullreferensi yang memungkinkan ). Selalu gunakan visibilitas minimum!
Maarten Bodewes
8

Dengan Project JUnion Anda dapat menggunakan struct di Java dengan membuat anotasi kelas dengan anotasi @Struct

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

Info lebih lanjut di situs web proyek: https://tehleo.github.io/junion/

Leo
sumber
Barang bagus. Sekarang saya mengerti bagaimana struktur (objek) direpresentasikan dalam memori. Thanks man :)
user218046
6

Ya, kelas adalah yang Anda butuhkan. Sebuah kelas mendefinisikan tipe sendiri.

Markus
sumber
6

Ya, Java belum memiliki tipe struct / nilai. Tapi, di versi Java yang akan datang, kita akan mendapatkan inline classyang mirip dengan struct di C # dan akan membantu kita menulis kode alokasi gratis.


inline class point { 
  int x;
  int y;
}

ganesan arunachalam
sumber
2

Structs "really" pure tidak didukung di Java. Misalnya, C # mendukung structdefinisi yang mewakili nilai dan dapat dialokasikan kapan saja.

Di Java, cara unik untuk mendapatkan perkiraan struct C ++

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

// Instantiation

{
    Token t = new Token;
}

tanpa menggunakan (buffer statis atau daftar) melakukan sesuatu seperti

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

Jadi, cukup alokasikan variabel atau tentukan secara statis ke dalam kelas.

Diva
sumber