Javaは構造体をサポートしていますか?


93

DOES JavaはC ++のアナログを持っていますstruct

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

自分のデータ型を使用する必要があります。


これらのあまりに文字通りコピーする:Javaでのフィールドは本当に小文字の文字で開始する必要があり、そうfirstNamelastNameおよびbirthYear(またはyearOfBirthもちろん)。
Maarten Bodewes

回答:


52

Javaには間違いなく構造体がありません:)しかし、ここで説明するのはJavaBeanのようなクラスのようです。


30
まあ、パブリック変数だけを持つクラスはひどくスタクトのように見えます。
mglauche 2011年

10
私たちは持っていますレコードをJavaの14で速い時間が飛ぶ方法を楽しまれ、9年後にこの答え。
ジョージ梁

クラスと構造体の主な違いの1つは、メモリ内での動作です。この点で、この答えは間違っています。Javaには構造体のように動作するものは何もありませんがinline class、近い将来、構造体のようになると私は信じています。
Calderwood

Beanにはプロパティ(つまり、ゲッターと通常はセッター)があり、今日では通常、Beanの要件に準拠するように注釈が付けられています。
Maarten Bodewes

88

Javaでは構造体に相当します

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

そして、適切な状況ではそれは何も悪いことではありません。カプセル化されたデータを持つクラスをいつ使用するかという点では、C ++の場合とほとんど同じです。


22
C ++で使用するのと同じ状況で、Javaで「POD」型クラスを使用します。「値オブジェクト」は、一度に複数の値を返すメソッドがあるJ2EEで思い浮かびます。getterメソッドとsetterメソッドを使用してデータをカプセル化しても意味がありません。フィールドを公開するだけで、より短く、よりわかりやすくなります。私がカプセル化する傾向がある「適切な」ものはすべて、C ++で行ったのと同じです。だから私は元のコメントを支持しますが、それはスタイルの選択です。私はあなたが何も失うとは思わない、そして確かにあなたが持っているものが価値クラスであるときそれはより記述的であると思う。
トムクワレンドン2011

16
Javaのクラスをセミコロンで終了する必要はありません。
シェフファラオ

14
私が間違っている場合は訂正してください。ただし、Structのポイントは、参照ではなく値で渡されるということです。クラスは常に参照によって渡されます。そのため、この答えは間違っています。
ULazdins 2017年

4
@ULazdins:C#構造体とC ++構造体を混同していると思います。クラスをC ++のメソッドに渡すと、コピーコンストラクターが呼び出されます。このコンストラクターは、デフォルトで各フィールドをコピーします。構文を明示的に使用して、参照によって渡す必要があります。
ロナウドナザレア2017

4
@PabloAriel私も以前のコメントに同意しません。私の考えは7年間で進化することが許されています;)
Michael Berry

16

実際、C ++の構造体はクラスです(たとえば、そこでメソッドを定義でき、拡張でき、クラスとまったく同じように機能します)。唯一の違いは、デフォルトのアクセス修飾子がパブリックに設定されていることです(クラスの場合はプライベートに設定されています)。デフォルト)。

これは本当にC ++の唯一の違いであり、多くの人はそれを知りません。; )


14

JavaにはC ++の構造体に類似したものはありませんが、すべてのパブリックメンバーでクラスを使用できます。


15
実際、structC ++のaは(ほとんどclassC ++のaと同じです。
ヨアヒムザウアー2011年

なぜこれらのメンバーが必要なのpublicですか、少なくともパッケージの内部に保持しないのはなぜですか?そのようなクラスは、通常、APIでの使用には適していません(可能なnull参照のためだけの場合)。常に最小限の可視性を使用してください!
Maarten Bodewes

8

Project JUnionを使用すると、クラスに@Structアノテーションを付けることで、Javaで構造体を使用できます。

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

プロジェクトのWebサイトで詳細を確認してくださいhttps//tehleo.github.io/junion/


良いもの。構造(オブジェクト)がメモリ内でどのように表されるかを理解しました。ありがとう男:)
user21804610月

6

はい、クラスはあなたが必要とするものです。クラスは独自の型を定義します。


6

はい、Javaにはまだ構造体/値型がありません。ただし、次のバージョンのJavaではinline class、C#のstructに似たものを取得し、割り当てのないコードを作成するのに役立ちます。


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 */ ;

したがって、変数を割り当てるか、静的にクラスに定義するだけです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.