C++에 typedef 키워드와 동등한 Java 또는 방법론이 있습니까?
C와 C++의 배경을 가지고 있기 때문에 현명한 사용이 매우 도움이 된다는 것을 알게 되었습니다.Java에서 유사한 기능을 실현하는 방법을 알고 계십니까? Java 메커니즘, 패턴 또는 기타 효과적인 방법을 알고 계십니까?
Java에는 원시적인 유형, 객체 및 어레이가 있습니다.typedef는 없습니다.
이 경우 typedef를 원하는 클래스를 확장할 수 있습니다. 예:
public class MyMap extends HashMap<String, String> {}
1.6 현재 Java에는 typedef가 없습니다.최종 클래스(Integer, Double 등)를 서브클래스로 할 수 없기 때문에 원하는 래퍼 클래스를 만들 수 있습니다.
아까도 말씀드렸듯이
Java에는 typedef 메커니즘이 없습니다.
저도 일반적으로 "가짜 수업"을 지지하지는 않지만, 여기에 일반적인 엄격한 경험칙이 있어서는 안 됩니다.
예를 들어 코드가 "일반 기반 유형"을 반복적으로 사용하는 경우 다음과 같습니다.
Map<String, List<Integer>>
그 목적을 위해 반드시 서브클래스를 갖는 것을 검토해야 합니다.
고려할 수 있는 또 다른 접근법은 예를 들어 다음과 같은 감속을 코드에 포함시키는 것입니다.
//@Alias Map<String, List<Integer>> NameToNumbers;
그런 다음 코드 NameToNumbers를 사용하여 관련 Java 코드를 처리하고 생성하는 사전 컴파일러 태스크(ANT/Gradle/Maven)를 갖습니다.
이 답변의 일부 독자들에게는 이상하게 들릴 수 있다는 것을 알지만, JDK 5 이전에 "주석"을 구현한 프레임워크의 수는 프로젝트 롬복과 다른 프레임워크입니다.
실제로 Javaland에 인계되는 typedef의 유일한 용도는 에일리어스, 즉 같은 클래스에 여러 이름을 붙이는 것입니다.즉, 클래스 "A"가 있고 "B"가 같은 것을 참조하도록 해야 합니다.C++에서는 "typedef B A"를 사용합니다.
안타깝게도, 그들은 그것을 지원하지 않습니다.그러나 관련된 모든 유형을 제어하면 라이브러리 수준에서 B를 A에서 확장하거나 B에게 A를 구현하도록 하는 등 지저분한 해킹을 할 수 있습니다.
다른 대체 방법이 있을 수 있습니다.
@Data
public class MyMap {
@Delegate //lombok
private HashMap<String, String> value;
}
다른 답변에서 설명한 바와 같이 의사 타입의 안티파터는 피해야 합니다.그러나 typedef는 그것을 달성하는 방법이 아니더라도 여전히 유용합니다.Java 표현이 동일한 여러 추상 유형을 구분하려고 합니다.패스워드 문자열과 번지 주소를 혼동하거나 오프셋을 나타내는 정수를 절대값을 나타내는 정수와 혼동하지 않는 것이 좋습니다.
Checker Framework를 사용하면 이전 버전과 호환되는 방식으로 typedef를 정의할 수 있습니다.나는 심지어 다음과 같은 원시적인 수업에서 일한다.int
최종 예: classes classes such such such such such such)String
런타임 오버헤드가 없고 동등성 테스트도 깨지지 않습니다.
Checker Framework 매뉴얼의 섹션 유형 별칭 및 typedef에서는 필요에 따라 typedef를 만드는 몇 가지 방법을 설명합니다.
Kotlin은 타입 에일리어스 https://kotlinlang.org/docs/reference/type-aliases.html를 지원합니다.유형 및 기능 유형의 이름을 변경할 수 있습니다.
경우에 따라서는 바인딩 주석이 원하는 대로 표시될 수 있습니다.
https://github.com/google/guice/wiki/BindingAnnotations
또는 Guice에 의존하지 않으려면 일반 주석만 달면 됩니다.
Enum은 제한된 값 집합만 허용한다는 점에서 typedef와는 의미적으로 조금 다르지만 사용할 수 있습니다.다른 가능한 솔루션은 이름 있는 래퍼 클래스입니다.
public class Apple {
public Apple(Integer i){this.i=i; }
}
특히 코드에서 클래스가 에일리어스 이외에는 다른 기능이 없다는 것이 명확하지 않다는 것을 고려하면, 그것은 훨씬 더 투박해 보입니다.
Typedef를 사용하면 항목이 아닌 유형에 암묵적으로 할당될 수 있습니다.일부 사람들은 확장 기능을 사용하여 이 문제를 해결하려고 합니다. IBM에서 이 방법이 좋지 않은 이유에 대한 설명을 읽어 보십시오.
(를 바랍니다) 안 될 것 .typedef
관리된 언어로 추한 머리를 기르고 있습니다.
Edit 2 : C# 에서는 소스 파일 상단에 이와 같은 using 스테이트먼트를 사용할 수 있습니다.중고품이기 때문에 두 번째 아이템은 필요 없습니다.이름 변경이 표시되는 것은 스코프가 두 유형 간에 이름 충돌을 일으킨 경우뿐입니다.이름 변경은 1개의 파일로 제한되어 있으며, 파일 외부에서 파일 이름을 사용한 모든 변수/파라미터 유형은 파일 이름으로 알 수 있습니다.
using Path = System.IO.Path;
using System.IO;
자바에서는 typedef가 필요 없습니다.원형을 제외하고 모든 것이 객체입니다.포인터는 없고 참조만 있습니다.일반적으로 typedef를 사용하는 시나리오는 대신 개체를 생성하는 경우입니다.
언급URL : https://stackoverflow.com/questions/1195206/is-there-a-java-equivalent-or-methodology-for-the-typedef-keyword-in-c
'source' 카테고리의 다른 글
입력 필드를 바인딩하고 vuex 상태를 동시에 업데이트하는 방법 (0) | 2022.08.30 |
---|---|
서비스 워커 이벤트가 호출되고 있음을 App.vue에 알리다 (0) | 2022.08.30 |
Java: 서브패키지 가시성? (0) | 2022.08.30 |
Apple에서 정적 라이브러리 결합 (0) | 2022.08.30 |
Vuetify Switch를 사용하여 Vuex 상태 변경 (0) | 2022.08.29 |