O Java tem um análogo de um C ++ struct
:
struct Member {
string FirstName;
string LastName;
int BirthYear;
};
Eu preciso usar meu próprio tipo de dados.
Respostas:
Java definitivamente não tem structs :) Mas o que você descreve aqui parece um tipo de classe JavaBean.
inline class
em algum momento no futuro próximo o que eu acredito seja mais como uma estrutura.
O equivalente em Java a uma estrutura seria
class Member
{
public String FirstName;
public String LastName;
public int BirthYear;
};
e não há nada de errado com isso nas circunstâncias certas. Quase o mesmo que em C ++ realmente em termos de quando você usa struct verses quando você usa uma classe com dados encapsulados.
Na verdade, um struct em C ++ é uma classe (por exemplo, você pode definir métodos lá, pode ser estendido, funciona exatamente como uma classe), a única diferença é que os modfiers de acesso padrão são definidos como públicos (para classes eles são definidos como privados por padrão).
Esta é realmente a única diferença em C ++, muitas pessoas não sabem disso. ; )
Java não tem um análogo aos structs do C ++, mas você pode usar classes com todos os membros públicos.
internal
é que é menos visível do que protected
. Um internal
membro declarado em com.myapp.lib
não estará acessível em com.myapp.main
, portanto, você não poderá acessá-lo em qualquer lugar no mesmo projeto.
public
é que você pode não querer expor um registro que pode facilmente ser colocado em um estado errado para muitas classes; deve ser mantido preferencialmente interno. Observe que os registros Java, conforme mencionado nesta resposta, são imutáveis (mas você sempre pode usar um método de fábrica para criar novos registros, é claro)
Java 14 adicionou suporte para registros, que são tipos de dados estruturados muito fáceis de construir.
Você pode declarar um registro Java assim:
public record AuditInfo(
LocalDateTime createdOn,
String createdBy,
LocalDateTime updatedOn,
String updatedBy
) {}
public record PostInfo(
Long id,
String title,
AuditInfo auditInfo
) {}
E, o compilador Java irá gerar a seguinte classe Java associada ao AuditInfo
Registro:
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 */ }
}
Observe que o construtor, os métodos de acesso, bem como equals
, hashCode
e toString
são criados para você, portanto, é muito conveniente usar Registros Java.
Um registro Java pode ser criado como qualquer outro objeto 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"
)
);
Para obter mais detalhes sobre como personalizar registros Java, consulte este artigo .
Com o Project JUnion, você pode usar structs em Java anotando uma classe com a anotação @Struct
@Struct
class Member {
string FirstName;
string LastName;
int BirthYear;
}
Mais informações no site do projeto: https://tehleo.github.io/junion/
Sim, o Java ainda não tem tipo de estrutura / valor. Mas, na próxima versão do Java, vamos obter algo inline class
semelhante a struct em C # e nos ajudará a escrever código livre de alocação.
inline class point {
int x;
int y;
}
Structs "realmente" puros não são suportados em Java. Por exemplo, C # oferece suporte a struct
definições que representam valores e podem ser alocados a qualquer momento.
Em Java, a maneira única de obter uma aproximação de estruturas C ++
struct Token
{
TokenType type;
Stringp stringValue;
double mathValue;
}
// Instantiation
{
Token t = new Token;
}
sem usar um (buffer estático ou lista) está fazendo algo como
var type = /* TokenType */ ;
var stringValue = /* String */ ;
var mathValue = /* double */ ;
Portanto, basta alocar variáveis ou defini-las estaticamente em uma classe.
var
, não é?
Junto com Java 14, ele começa a oferecer suporte a Record. Você pode querer verificar se https://docs.oracle.com/en/java/javase/14/docs/api/java.base/java/lang/Record.html
public record Person (String name, String address) {}
Person person = new Person("Esteban", "Stormhaven, Tamriel");
E há classes seladas após o Java 15. https://openjdk.java.net/jeps/360
sealed interface Shape permits Circle, Rectangle {
record Circle(Point center, int radius) implements Shape { }
record Rectangle(Point lowerLeft, Point upperRight) implements Shape { }
}
firstName
,lastName
ebirthYear
(ou éyearOfBirth
claro).