CおよびC ++の経歴を持っているので、の賢明な使用typedef
が非常に役立つことがわかりました。Javaメカニズム、パターン、その他の効果的な方法など、Javaで同様の機能を実現する方法を知っていますか?
public interface ScopeFactory { <Scope extends Map<String, Object>> Scope create(...) throws Exception; }
CおよびC ++の経歴を持っているので、の賢明な使用typedef
が非常に役立つことがわかりました。Javaメカニズム、パターン、その他の効果的な方法など、Javaで同様の機能を実現する方法を知っていますか?
public interface ScopeFactory { <Scope extends Map<String, Object>> Scope create(...) throws Exception; }
回答:
Javaにはプリミティブ型、オブジェクト、配列があり、それだけです。typedefはありません。
typedef
に再定義boolean
したいと思いbool
ます。
typedef int PlayerID
ます。これにより、コンパイラーはPlayerIDが他のintと互換的に使用されていないことを確認でき、人間にとってコードがはるかに読みやすくなります。基本的に、それは列挙型のようなものですが、値のセットが制限されていません。
typedef MegaLongTemplateClass<With, Many, Params> IsShorten;
です。
typedef
そのようなことを有効にしません。型に別の名前を付けるだけです。
int
あり、それをに変更する必要long
がある場合、IDを操作するコードのすべての場所で変更する必要がある場合にも役立ちます。があった場合はtypedef
、1か所で変更するだけで済みます。
これがあなたの言いたいことであれば、typedefしたいクラスを単に拡張することができます。例えば:
public class MyMap extends HashMap<String, String> {}
typedef
記事がそれらの偽のクラスについて説明している問題はありません(そしてそれらは非常に現実的です)。
final
クラス。
1.6の時点ではJavaにtypedefはありません。最終クラス(Integer、Doubleなど)をサブクラス化できないため、実行できることは、目的のラッパークラスを作成することです。
他の人が以前に述べたように、
Javaにはtypedefメカニズムはありません。
私は一般に「偽クラス」もサポートしていませんが、ここでは一般的な厳密な経験則はありません。
たとえば、コードで「ジェネリックベースの型」を何度も繰り返し使用する場合は、次のようになります。
Map<String, List<Integer>>
あなたは間違いなくその目的のためにサブクラスを持つことを考慮すべきです。
たとえば、次のような減速をコードに含めることもできます。
//@Alias Map<String, List<Integer>> NameToNumbers;
次に、コードでNameToNumbersを使用し、プリコンパイラタスク(ANT / Gradle / Maven)を使用して、関連するJavaコードを処理および生成します。
この回答の読者の一部にとってこれは奇妙に聞こえるかもしれませんが、これはJDK 5より前の「注釈」を実装したフレームワークの数であり、これがロンボクが行うプロジェクトやその他のフレームワークです。
本当に、Javalandに引き継がれるtypedefの唯一の使用法はエイリアスです。つまり、同じクラスに複数の名前を付けます。つまり、クラス「A」があり、「B」が同じものを参照するようにします。C ++では、「typedef BA;」を実行します。
残念ながら、彼らはそれをサポートしていません。ただし、関係するすべてのタイプを制御する場合は、ライブラリレベルで厄介なハックをプルできます。AからBを拡張するか、BにAを実装させることができます。
typedef
も、ジェネリック型の呼び出しのためのエイリアスを作成することは有用であろう。例:(typedef A<Long,String> B;
これはあなたが説明したことの特別なケースかもしれませんが、それはアイデアの魅力をもう少しはっきりと示しています)。
real_t
用double
とbool
のためにboolean
。
おそらく、これは別の可能な置換である可能性があります:
@Data
public class MyMap {
@Delegate //lombok
private HashMap<String, String> value;
}
myMap
typeのインスタンスを定義するときはいつでもMyMap
、のmyMapInstance.value.SomeOperation()
代わりに入力するだけで実際のHashMapを操作できるため、これには問題があると思いませんかmyMapInstance.SomeOperation()
。面倒ですよね。
他の回答で述べたように、疑似typedefアンチパターンを回避する必要があります。ただし、typedefは、それを実現する方法ではない場合でも有用です。同じJava表現を持つ異なる抽象型を区別したい。パスワードである文字列と住所である文字列、またはオフセットを表す整数と絶対値を表す文字列を混同したくない場合。
チェッカーFrameworkは下位互換性のある方法でのtypedefを定義することができます。などのプリミティブクラスやのようなint
最終クラスでも機能しString
ます。実行時のオーバーヘッドがなく、同等性テストを中断しません。
Checker Frameworkマニュアルのセクションタイプエイリアスとtypedefsでは、必要に応じてtypedefを作成するいくつかの方法について説明しています。
Kotlinはタイプエイリアスhttps://kotlinlang.org/docs/reference/type-aliases.htmlをサポートしています。タイプと関数タイプの名前を変更できます。
場合によっては、バインディングアノテーションがあなたが探しているものだけかもしれません:
https://github.com/google/guice/wiki/BindingAnnotations
あるいは、Guiceに依存したくない場合は、通常のアノテーションで十分です。
Typedefを使用すると、アイテムを暗黙的に割り当てられていないタイプに割り当てることができます。一部の人々は拡張機能でこれを回避しようとします。これが悪い考えである理由の説明については、IBMでここを読んでください。
編集:強力な型推論は便利なものですが、typedef
管理された言語で醜い頭を育てるのは(決して?)
編集2:C#では、ソースファイルの先頭で次のようなusingステートメントを使用できます。表示されている2番目の項目を実行する必要がないように使用されます。名前の変更が表示されるのは、スコープが2つのタイプ間で名前の衝突を引き起こしたときだけです。名前の変更は1つのファイルに制限されており、そのファイルの外では、そのファイルを使用したすべての変数/パラメーターの型がフルネームで認識されます。
using Path = System.IO.Path;
using System.IO;
Javaではtypedefは必要ありません。プリミティブ以外はすべてオブジェクトです。ポインタはなく、参照のみです。通常typedefを使用するシナリオは、代わりにオブジェクトを作成するインスタンスです。
UnmodifiableDirectedGraph<IncrediblyFancyEdgeType, IncrediblyFancyAbstractNode.EvenFancierConcreteNode>
か、またはIncrediblyFancyGraph
?私はいつでも定義を参照して、それが実際に何であるかを知ることができます。そうすればUnmodifiableDirectedGraph<IncrediblyFancyEdge,IncredilyFancyAbstractNode.SlightlyLessFancyConcreteNode>
、退屈を逃さないようにすることもできます。
Enterprise
ます。