2012/12/30
android.net.Uri と java.net.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.URI | android.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 件のコメント:
コメントを投稿