Java yapıları destekliyor mu?


95

Java'nın bir C ++ analogu var mı struct:

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

Kendi veri türümü kullanmam gerekiyor.


O da tam anlamıyla kopyalama için: Java alanlar gerçekten MAX_PACKAGE_NAME_LENGTH karakter gerekir, bu nedenle firstName, lastNameve birthYear(veya yearOfBirthtabii ki).
Maarten Bodewes

Yanıtlar:


51

Java'nın kesinlikle hiçbir yapısı yoktur :) Ama burada anlattığınız şey JavaBean türü bir sınıf gibi görünüyor.


31
Eh, sadece genel değişkenleri olan bir sınıf, korkunç bir şekilde bir davranış gibi görünür.
mglauche

10
Bu cevaptan 9 yıl sonra Java 14'te rekorlara sahip olacağız . Zamanın ne kadar hızlı uçtuğu çok eğlenceli.
George Leung

Sınıflar ve yapılar arasındaki en büyük farklardan biri, bellekte nasıl davrandıklarıdır. Bu bakımdan bu cevap yanlıştır. Java'nın bir yapı gibi davranan hiçbir şeyi yoktur, ancak umarım inline classyakın gelecekte bir noktada bir yapıya benzediğine inanıyorum.
Will Calderwood

Bir fasulyenin özellikleri (yani alıcılar ve genellikle ayarlayıcılar) vardır ve günümüzde genellikle bir fasülyenin gereksinimlerine uyması için açıklanmaktadır.
Maarten Bodewes

88

Java'da bir yapının eşdeğeri şöyle olacaktır:

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

ve doğru koşullarda bunda yanlış bir şey yok. Kapsüllenmiş verilere sahip bir sınıf kullandığınızda struct verses'i ne zaman kullandığınıza dair C ++ ile hemen hemen aynı.


22
Java'da "POD" türü sınıfları, C ++ 'da yaptığım gibi aynı koşullarda kullanırdım. Aynı anda birden çok değer döndüren bir yönteme sahip olduğunuz J2EE'de "değer nesneleri" akla gelir. Verileri alıcı ve ayarlayıcı yöntemlerle kapsüllemenin bir anlamı yok, sadece alanları halka açık hale getirin - daha kısa ve daha açıklayıcı. Kapsülleme eğiliminde olduğum "uygun" herhangi bir şey, aynı şekilde C ++ 'da yapıyordum. Bu yüzden orijinal yorumumun arkasındayım, ama bu bir stil seçimi. Hiçbir şey kaybettiğinizi sanmıyorum ve aslında sahip olduğunuz şey bir değer sınıfı olduğunda daha açıklayıcı olduğunu düşünüyorum.
Tom Quarendon

16
Java'da bir sınıfı noktalı virgülle sonlandırmaya gerek yok.
Chef Pharaoh

14
Yanılıyorsam düzeltin, ancak Struct'ın amacı, referansla değil, değerle aktarılmasıdır. Sınıflar her zaman referans olarak aktarılır. Bu yüzden bu cevap yanlış.
ULazdins

4
@ULazdins: C # yapılarını C ++ yapılarıyla karıştırdığınızı düşünüyorum. Bir sınıfı C ++ 'da bir yönteme ilettiğinizde, varsayılan olarak her alanı kopyalayan copy yapıcısını çağırır. Sözdizimini başvuruya göre iletmek için açıkça kullanmanız gerekir.
Ronaldo Nazarea

4
@PabloAriel Ben de önceki yorumuma katılmıyorum. Düşüncemin 7 yıl içinde gelişmesine izin verildi;)
Michael Berry

16

Aslında C ++ 'da bir yapı bir sınıftır (örneğin, yöntemleri orada tanımlayabilirsiniz, genişletilebilir, tam olarak bir sınıf gibi çalışır), tek fark, varsayılan erişim değiştiricilerinin genel olarak ayarlanmasıdır (sınıflar için özel olarak ayarlanmıştır varsayılan olarak).

Bu gerçekten C ++ 'daki tek fark, birçok insan bunu bilmiyor. ; )


14

Java'nın C ++ 'nın yapılarına bir analogu yoktur, ancak sınıfları tüm genel üyelerle kullanabilirsiniz.


15
Aslında structC ++ 'da a, ( hemen hemen ) classC ++' daki a ile aynı şeydir .
Joachim Sauer

Neden bu üyelerin olması gerekiyor public, neden onları en azından paketin içinde tutmuyoruz? Bunun gibi sınıflar genellikle bir API'de kullanılmaya uygun değildir (eğer sadece olası nullreferanslar içinse ). Daima minimum görünürlüğü kullanın!
Maarten Bodewes

8

Project JUnion ile bir sınıfa @Struct ek açıklaması ekleyerek yapıları Java'da kullanabilirsiniz.

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

Projenin web sitesinde daha fazla bilgi: https://tehleo.github.io/junion/


İyi şeyler. Yapıların (nesnelerin) bellekte nasıl temsil edildiğini şimdi anlıyorum. Teşekkürler dostum :)
user218046

6

Evet, ihtiyacınız olan şey bir sınıftır. Bir sınıf, kendi türünü tanımlar.


6

Evet, Java henüz yapı / değer türüne sahip değil. Ancak Java'nın gelecek sürümünde, inline classC # 'daki yapıya benzer olanı alacağız ve tahsisatsız kod yazmamıza yardımcı olacak.


inline class point { 
  int x;
  int y;
}


6

Java 14, oluşturulması çok kolay olan yapılandırılmış veri türleri olan Kayıtlar için destek ekledi.

Şu şekilde bir Java kaydı beyan edebilirsiniz:

public record AuditInfo(
    LocalDateTime createdOn,
    String createdBy,
    LocalDateTime updatedOn,
    String updatedBy
) {}
 
public record PostInfo(
    Long id,
    String title,
    AuditInfo auditInfo
) {}

Ve Java derleyicisi, AuditInfoKayıt ile ilişkili aşağıdaki Java sınıfını oluşturacaktır :

public final class PostInfo
        extends java.lang.Record {
    private final java.lang.Long id;
    private final java.lang.String title;
    private final AuditInfo auditInfo;
 
    public PostInfo(
            java.lang.Long id,
            java.lang.String title,
            AuditInfo auditInfo) {
        /* compiled code */
    }
 
    public java.lang.String toString() { /* compiled code */ }
 
    public final int hashCode() { /* compiled code */ }
 
    public final boolean equals(java.lang.Object o) { /* compiled code */ }
 
    public java.lang.Long id() { /* compiled code */ }
 
    public java.lang.String title() { /* compiled code */ }
 
    public AuditInfo auditInfo() { /* compiled code */ }
}
 
public final class AuditInfo
        extends java.lang.Record {
    private final java.time.LocalDateTime createdOn;
    private final java.lang.String createdBy;
    private final java.time.LocalDateTime updatedOn;
    private final java.lang.String updatedBy;
 
    public AuditInfo(
            java.time.LocalDateTime createdOn,
            java.lang.String createdBy,
            java.time.LocalDateTime updatedOn,
            java.lang.String updatedBy) {
        /* compiled code */
    }
 
    public java.lang.String toString() { /* compiled code */ }
 
    public final int hashCode() { /* compiled code */ }
 
    public final boolean equals(java.lang.Object o) { /* compiled code */ }
 
    public java.time.LocalDateTime createdOn() { /* compiled code */ }
 
    public java.lang.String createdBy() { /* compiled code */ }
 
    public java.time.LocalDateTime updatedOn() { /* compiled code */ }
 
    public java.lang.String updatedBy() { /* compiled code */ }
}

Bildirim o yanısıra yapıcı, erişimci yöntemleri, equals, hashCode, ve toStringbu Java Kayıtları kullanmak çok uygun, sizin için oluşturulur.

Herhangi bir Java nesnesi gibi bir Java Kaydı oluşturulabilir:

PostInfo postInfo = new PostInfo(
    1L,
    "High-Performance Java Persistence",
    new AuditInfo(
        LocalDateTime.of(2016, 11, 2, 12, 0, 0),
        "Vlad Mihalcea",
        LocalDateTime.now(),
        "Vlad Mihalcea"
    )
);

Java Kayıtlarını nasıl özelleştirebileceğiniz hakkında daha fazla ayrıntı için bu makaleye göz atın .


2

Java'da "gerçekten" saf yapılar desteklenmez. Örneğin, C #, structdeğerleri temsil eden ve herhangi bir zamanda tahsis edilebilen tanımları destekler .

Java'da, C ++ yapılarının yaklaşık değerini elde etmenin benzersiz yolu

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

// Instantiation

{
    Token t = new Token;
}

bir (statik arabellek veya liste) kullanmadan,

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

Dolayısıyla, değişkenleri ayırın veya statik olarak onları bir sınıfa tanımlayın.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.