Quantcast
Channel: C#タグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9370

C#とJavaの書き方の違いをまとめる

$
0
0

前置き

いつもはC#で開発をしていますが、使用するAPIにC#用のインターフェースがまだ整っていなくJavaで開発を始めてみました。
あまりJavaは触ったことがなかったため、C#でいう「xxxx」はJavaでいう「xxxx」というのをまとめてみました。
私がよく使っている予約語、実装方法が中心となっています。そのため全ての違いが網羅できているわけではありません。

C#とJavaの予約語、実装方法の違い

予約語の違い

C#、Javaでの予約語の違い、変わらない点をまとめてみました。
同じ、似ていると思った項目を横並びにして比較してみます。

差異C#Java備考
namespacepackage
usingimport
なしclassclass
:extendsクラス継承
なしinterfaceinterface
なしabstractabstract
virtualなし継承先で関数をoverride可能にする場合、C#はvirtualを付与、Javaはなし
override@OverrideC#は定義に含めるが、Javaはアノテーション(C#で言う属性、Attribute)
constfinal定数、Javaは引数に対しても付与可能
sealedfinalクラス継承禁止、Javaは関数のoverride禁止としても使用する
なしEnumEnuml列挙型
structなし構造体

Javaには「struct」、「virtual」がありませんでした。
「struct」はclassでそれっぽく代用できるため問題なさそうですが、「virtual」は無いと少し困りそうです。
「virtual」については下記のタイトルでページの最後に掘り下げてみます。
・「C#のvirtualとJavaのfinal」

実装方法の違い

C#での実装方法、Javaでの実装方法、どちらにしかない実装方法をまとめてみました。
こちらも同じ、似ていると思った項目を横並びにして比較してみます。

やりたいことC#Java
属性自作Attributeの継承@interfaceでクラス定義
拡張メソッドpublic static classなし
interfaceのデフォルト実装なしinterfaceを継承し、メンバをdefaultで定義
リソースの自動解放using(Stream stream = new Stream())なし(手動解放)
型パラメータの制約where T: int<T extends Number>
上記例)void Test<T>(T arg)void Test<T>(T arg) where T : int<T extends Number> void Test(T arg)
Null許容型宣言Nullable<T>,T?Optional<T>
ラムダ式()=>{ }()->{ }
コールバック引数なしActionRunnable
同上 引数1つAction<T>Consumer<T>
同上 引数2つAction<T1,T2>BiConsumer<T,U>(引数は最大2つまで)
同上 返り値ありFunction<R>API仕様の関数型インターフェースを見る限りなし
同上 引数1つ、返り値ありFunction<T,R>Function<T,R>
同上 引数2つ、返り値ありFunction<T1,T2,R>BiFunction<T,U,R>(引数は2つまで)

実装方法が違ったり、C#、Javaのどちらにしかない実装方法がありました。
Javaに無くて不便な部分がありますが、逆にjavaのみの機能「interfaceのデフォルト実装」は便利そうですね。
abstractとinterfaceで迷い後者で実装したけど、継承先で同じ実装を行った経験がある人はきっといるはず。私です
これは是非活用していきたいですね。

また、C#で言う「Action」、「Function」、いわゆるコールバックの使い勝手がかなり違いそうです。
「コールバック」については下記のタイトルでページの最後に掘り下げてみます。
・コールバックの使い方の違い

C#とJavaで似ているようで違う点を掘り下げる

「予約語の違い」、「実装方法の違い」で挙げた2つについて掘り下げていきます。

C#のvirtualとJavaのfinal

C#では「virtual」でoverrideを可能にし(正確には仮想メソッドとして実装)、Javaは「final」でoverrideを禁止します。
つまりJavaの関数に「final」を付けなかった場合、C#の感覚で言うと常に「virtual」での実装になります。
いつの間にかoverrideされてる!?といった状況になりたくなければ必ず「final」を付けたほうがよさそうですね。。

コールバックの使い方の違い

C#とJavaのコールバックの違いはざっくりとこんな感じです。
この違いを把握していればC#とJavaで混乱するとはなさそうです。

  • Javaのコールバックは引数の数に上限があり、C#は最大16個まで取れる。

  • Javaのコールバックで数値型を引数に取れないが、C#は全ての型を引数に取れる。(※1)

※1
今回記事に挙げたJavaのコールバックは参照型のみを引数に取れます。
そのためC#と違い、Javaでは数値型を引数に取ることができません。数値が設定できなくて困惑したのは私です
その代わりに数値型用のコールバックがあり下記の名前で定義されているためこちらを使います。
・「数値型」Consumer
・Obj「数値型」Consumer
・「数値型Function」
・To「数値型」Function
・To「数値型」BiFuction

参考にしたページ

Java(tm) Platform, Standard Edition 8 API仕様

最後に

C#とJavaは言語のベースが同じだから似ていると聞いたことはありました。調べていく中で予約語に同じものが多かったりと確かに似ていると感じました。
また、実際にコードを書かないと気づけない違い(予約語が前後するなどの小さな違い)があったため、知識をため込むだけでなく、アウトプットのすることの大事さを改めて感じました。
ただ似た書き方をしていながら、異なる動きをする場合があるため、エラーが起きた場合に嵌らないようにしたいですね。


Viewing all articles
Browse latest Browse all 9370

Latest Images

Trending Articles