web-dev-qa-db-ja.com

C ++のtypedefキーワードに相当するJava方法論はありますか?

CとC++のバックグラウンドから来て、私はtypedefの賢明な使用が非常に役立つことを発見しました。 Javaメカニズム、パターン、または使用した他の効果的な方法であっても、Javaで同様の機能を実現する方法を知っていますか?

234
bn.

Javaにはプリミティブ型、オブジェクト、配列があり、それだけです。 typedefはありません。

107
cletus

これがあなたの言うことなら、typedefしたいクラスを単純に拡張することができます、例えば:

public class MyMap extends HashMap<String, String> {}
96
Zed

1.6のJavaにはtypedefがありません。最終クラス(Integer、Doubleなど)をサブクラス化できないため、目的のラッパークラスを作成できます。

14
z -

他の人が以前に言及したように、
Javaにはtypedefメカニズムはありません。
一般的に「偽のクラス」もサポートしていませんが、一般的な厳密な経験則はありません。
たとえば、コードで繰り返し使用される「ジェネリックベースタイプ」の場合:

Map<String, List<Integer>> 

そのためにサブクラスを用意することを絶対に検討する必要があります。
考えられる別のアプローチは、たとえば次のような減速をコードに含めることです。

//@Alias Map<String, List<Integer>>  NameToNumbers;

次に、コードでNameToNumbersを使用し、プリコンパイラタスク(ANT/Gradle/Maven)を使用して、関連するJavaコードを処理および生成します。
この回答の一部の読者にはこれは奇妙に聞こえるかもしれませんが、これはJDK 5より前の「注釈」を実装したフレームワークの数であり、これがプロジェクト lombok が行っていることですおよびその他のフレームワーク。

7
Yair Zaslavsky

実際、Javalandに引き継がれるtypedefの唯一の使用法はエイリアスです。つまり、同じクラスに複数の名前を付けます。つまり、クラス「A」があり、「B」に同じものを参照させたいとします。 C++では、「typedef B A;」を実行します。

残念ながら、彼らはそれをサポートしていません。ただし、関連するすべてのタイプを制御する場合、ライブラリレベルで厄介なハッキングを行うことができます。AからBを拡張するか、BにAを実装させることができます。

5
Zack Yezek

他の回答で述べたように、 pseudo-typedef antipattern を避ける必要があります。ただし、typedefは、それを実現する方法ではない場合でも引き続き有用です。同じJava表現を持つ異なる抽象型を区別したい場合。パスワードの文字列と番地の文字列、またはオフセットを表す整数と絶対値を表す文字列を混同したくないでしょう。

Checker Framework を使用すると、下位互換性のある方法でtypedefを定義できます。 intなどのプリミティブクラスとStringなどの最終クラスでも動作します。実行時のオーバーヘッドはなく、等価性テストを中断しません。

Checker Frameworkマニュアルのセクション Type aliases and typedefs では、ニーズに応じてtypedefを作成するいくつかの方法について説明しています。

2
mernst

おそらく、これは別の可能な置き換えになる可能性があります:

@Data
public class MyMap {
    @Delegate //lombok
    private HashMap<String, String> value;
}
2
shrewquest