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.
java
data-structures
Dmitry
fonte
fonte
firstName
,lastName
ebirthYear
(ou éyearOfBirth
claro).Respostas:
Java definitivamente não tem structs :) Mas o que você descreve aqui parece um tipo de classe JavaBean.
fonte
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.
fonte
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. ; )
fonte
Java não tem um análogo aos structs do C ++, mas você pode usar classes com todos os membros públicos.
fonte
struct
em C ++ é ( praticamente ) a mesma coisa que aclass
em C ++.internal
é que é menos visível do queprotected
. Uminternal
membro declarado emcom.myapp.lib
não estará acessível emcom.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
etoString
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 .
fonte
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/
fonte
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; }
fonte
Sim, uma aula é o que você precisa. Uma classe define um tipo próprio.
fonte
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.
fonte
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 { } }
fonte