2012/12/30

android.net.Uri と java.net.URI の違い

Android でネットワーク系の開発をしていると必ず出てくる Uri。
これ、android.net.Uri と java.net.URI と2種類あって混乱する時があります。(java.net.URL ってのもありますが、それはまた別のお話)
で、どう違うのか調べてみたので備忘録として書いておきます。

まず、どちらも URI を表すクラスである点では同じです。
参考

そして、パッケージ名を見れば明らかなのですが、 android.net.Uri は android 用に作成されたクラスなのに対して、 java.net.URI は java で定義されているクラスです。
(import しちゃうと途端に区別がつきにくくなるんですけどね…)

まず、大きな違いとしては、java.net.URI は Serializable なクラスなのに対し、android.net.Uri は Parcelable なクラスであるところと、 android.net.Uri は abstract なクラスであるところが挙げられます。

以下に、それぞれに定義されているメソッドを列挙してみました。

双方に定義されているもの
  • getAuthority()
  • getFragment()
  • getHost()
  • getPath()
  • getPort()
  • getQuery()
  • getScheme()
  • getSchemeSpecificPart()
  • getUserInfo()
  • isAbsolute()
  • isOpaque()

ほぼイコールのもの
java.net.URIandroid.net.Uri
URI.create(String)Uri.parse(String)
getRawAuthority()getEncodedAuthority()
getRawFragment()getEncodedFragment()
getRawPath()getEncodedPath()
getRawQuery()getEncodedQuery()
getRawSchemeSpecificPart()getEncodedSchemeSpecificPart()
getRawUserInfo()getEncodedUserInfo()
normalize()normalizeScheme()
resolve(String)
resolve(URI)
Uri.withAppendedPath(Uri, String)

java.net.URI のみに定義されているもの
  • parseServerAuthority()
  • relativize(URI)
  • toASCIIString()

android.net.Uri のみに定義されているもの
  • Uri.decode(String)
  • Uri.encode(String)
  • Uri.encode(String, String)
  • Uri.fromFile(File)
  • Uri.fromParts(String, String, String)
  • buildUpon()
  • getBooleanQueryParameter(String, boolean)
  • getLastPathSegment()
  • getPathSegments()
  • getQueryParameter(String)
  • getQueryParameterNames()
  • getQueryParameters(String)
  • isHierarchical()
  • isRelative()

ざっと見比べると、java.net.URI で定義されているメソッドはほとんど android.net.Uri でも定義されていて、さらに便利なメソッドを追加したのだなということがわかります。

ちょっと特徴的なのは、Uri.fromFile(File) というメソッドが追加されているところです。
Uri.parse(String) で返されるインスタンスは StringUri であるのに対し、Uri.fromFile(File) で返されるインスタンスは HierarchicalUri で、階層化されていることが保証されています。(android.net.Uri は abstract class なのです)
と言っても使う際には、あまり気にする必要の無いことなのですが。

というわけで、java.net.URI と android.net.Uri はほぼ同じだけど、ちょっとだけ android.net.Uri の方が便利になっているということがわかりました。


ところで、自分でプログラムを書いている時、どちらを使ったほうが良いのでしょうか?
意見の分かれるところかもしれませんが、Android に非依存のライブラリ等の場合は java.net.URI を使っておいた方が良いかもしれません。
しかし、多少でも Android 依存のコードであるならば android.net.Uri を使用した方が良いのではないかと思います。
Android 内では Parcelable でないと不便なことが多々ありますので。

もちろん、場面ごとに変換が必要になりますが、それは簡単に出来ますし、致し方ないでしょう。

参考: 穀風: android.net.Uri と java.net.URI の変換

0 件のコメント: