합니까 자바는 C ++의 아날로그 있습니다 struct
:
struct Member {
string FirstName;
string LastName;
int BirthYear;
};
내 데이터 유형을 사용해야합니다.
답변:
Java에는 확실히 구조체가 없습니다. :) 그러나 여기에서 설명하는 것은 JavaBean 종류의 클래스처럼 보입니다.
inline class
가까운 장래에 내가 구조체와 더 비슷하다고 생각하는 시점 이 있기를 바랍니다 .
Java에서 구조체에 해당하는 것은 다음과 같습니다.
class Member
{
public String FirstName;
public String LastName;
public int BirthYear;
};
그리고 올바른 상황에서는 잘못된 것이 없습니다. 캡슐화 된 데이터가있는 클래스를 사용할 때 구조체 구절을 언제 사용 하는가 측면에서 C ++에서와 거의 동일합니다.
실제로 C ++의 구조체는 클래스입니다 (예 : 여기에서 메서드를 정의 할 수 있고 확장 할 수 있으며 클래스와 똑같이 작동 함). 유일한 차이점은 기본 액세스 수정자가 public으로 설정되어 있다는 것입니다 (클래스의 경우 private로 설정 됨). 기본적으로).
이것은 실제로 C ++의 유일한 차이점이며 많은 사람들이 그것을 모릅니다. ; )
Java는 C ++의 구조체와 유사하지 않지만 모든 공용 멤버와 함께 클래스를 사용할 수 있습니다.
public
입니까? 최소한 패키지 내부에 있어야하는 이유는 무엇입니까? 이와 같은 클래스는 일반적으로 API에서 사용하기에 적합하지 않습니다 (가능한 null
참조 용인 경우). 항상 최소한의 가시성을 사용하십시오!
Project JUnion을 사용하면 @Struct 주석으로 클래스에 주석을 달아 Java에서 구조체를 사용할 수 있습니다.
@Struct
class Member {
string FirstName;
string LastName;
int BirthYear;
}
프로젝트 웹 사이트에서 더 많은 정보 : https://tehleo.github.io/junion/
Java 14에는 빌드하기 매우 쉬운 구조화 된 데이터 유형 인 레코드에 대한 지원이 추가되었습니다.
다음과 같이 Java 레코드를 선언 할 수 있습니다.
public record AuditInfo(
LocalDateTime createdOn,
String createdBy,
LocalDateTime updatedOn,
String updatedBy
) {}
public record PostInfo(
Long id,
String title,
AuditInfo auditInfo
) {}
그리고 Java 컴파일러는 AuditInfo
레코드 와 연관된 다음 Java 클래스를 생성합니다 .
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 */ }
}
공지 사항 그뿐만 아니라 생성자, 접근 방법 equals
, hashCode
그리고 toString
그것을 자바 레코드를 사용하기가 매우 편리합니다, 그래서 당신을 위해 만들어집니다.
Java 레코드는 다른 Java 객체처럼 생성 할 수 있습니다.
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에는 아직 구조체 / 값 유형이 없습니다. 그러나 차기 버전의 Java에서는 inline class
C #의 struct와 유사한 것을 얻고 할당 무료 코드를 작성하는 데 도움이 될 것입니다.
inline class point {
int x;
int y;
}
"정말"순수 구조체는 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 */ ;
따라서 간단히 변수를 할당하거나 클래스에 정적으로 정의하십시오.
Java 14와 함께 Record 지원을 시작합니다. https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Record.html 을 확인하는 것이 좋습니다.
그리고 Java 15 이후에는 Sealed Class가 있습니다. https://openjdk.java.net/jeps/360
firstName
,lastName
및birthYear
(또는yearOfBirth
물론).