Java'nın bir C ++ analogu var mı struct:
struct Member {
string FirstName;
string LastName;
int BirthYear;
};
Kendi veri türümü kullanmam gerekiyor.
Yanıtlar:
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.
inline classyakın gelecekte bir noktada bir yapıya benzediğine inanıyorum.
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ı.
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. ; )
Java'nın C ++ 'nın yapılarına bir analogu yoktur, ancak sınıfları tüm genel üyelerle kullanabilirsiniz.
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!
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/
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;
}
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 .
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.
Java 14 ile birlikte Kaydı desteklemeye başlar. Https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Record.html adresini kontrol etmek isteyebilirsiniz.
Ve Java 15'ten sonra Mühürlü Sınıflar var. Https://openjdk.java.net/jeps/360
firstName,lastNamevebirthYear(veyayearOfBirthtabii ki).