Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

アノテーション応用

はじめまして。Javaのアノテーションについて早速で悪いのですが、ヒントをください。

Javaにはフレンドがないので以下のようなことをしたいのですが、

クラスAで

@Friend(クラスB)
publicメソッド宣言

クラスBで
さっきのメソッド呼び出し→問題なし

クラスCで
さっきのメソッド呼び出し→@Deprecatedのように線が引かれワーニング。

このようなことをしたいのですが、できますでしょうか??
ネット上にはあまりアノテーションの発展的な記事が見つからず、アノテーションにテーマをしぼった書籍も見つからないので、いまいちどうすれば良いのか・・・

よろしくお願いします。

5

回答

83896

閲覧

5件の回答

評価

0

アノテーション自体はマーキングに過ぎず処理を持ってはいません。

@Overrideアノテーションのついていない派生メソッドに対してエラーを出しているのは、@Overrideアノテーションではなくコンパイラです。

@Hideアノテーションのついているメソッドをコード補完に出ないようにしているのは、@Hideアノテーションではなくeclipse JDTエディタなどの開発環境です。

@Deprecatedアノテーションのついた要素に赤線を引いているのはeclipse JDTなど、その要素の使用を警告してくれているのはコンパイラです。

あなたがやろうとしている@Friendを実現するためには、eclipse JDTなどの開発環境で対応する必要があると思います。

もしくは、実行時に検査して弾くという方法なら開発環境に手を加えずともユーザーコードで実現することはできそうです。クラスAの@Friendアノテーションの付いたメソッドを呼び出したときに、コールスタックから呼び出し元のクラスを調べることはできます。そのクラスとアノテーションパラメータに記述されたクラスが一致しなければ、不正な呼び出しとして例外を投げるということなら簡単に実装できます。

本当にfriendが必要なのかどうか考え直して欲しいですけどね。せっかく、C++から削ったfriendなのですから。

評価

0

ありがとうございました。

デフォルトのアノテーションでのことはコンパイラや環境が提供するものだったんですね。中線が引かれること自体は統合開発環境によるものにしか見えなかったのでコンパイラから何かしらを受け取ってあのような処理をしていると思い込み、Deprecatedを参考にすれば同じようなことをできるのかと思いました。

確かにフレンドを使いたいという発想自体がjavaに不要だったのかも知れません。
もう一度クラス間のデザインを考え直してみようと思います。

評価

20

friendが欲しくなるケースは、ないことはない。
再設計すれば不要だったり、そもそもそこまで制約つけても…という場合が大抵だ
けど。
再設計の時間が取れず、後者で妥協することが多いんじゃないかな。


Eclipseには、あるパッケージに対して外部からアクセスできないようにする、独自
の機能がある。
設定をいじるくらいの人間がいなければこれで十分だし、逆にいじるような人間な
ら分かっててそうするのだろう、とも考えられる。

評価

0

Java7 に実装予定だった namespace が Java8できたらつかうといい。

評価

0

ご返答ありがとうございます。
>$さん
実は個人での開発ですが、規模が大きくなってきたので自分の中での混乱を避けるため、フレンドを考えていました。
デザインとして同じクラスのインスタンス同士でのみ呼び出せるような仕様にしたかったのですが、同じクラスでも別のインスタンスであればパブリックアクセスになってしまいます。
今のところ自分の中で解決案はそのクラスにプライベートのスタティック関数を持たせ、引数にそのクラスのインスタンスを与えることでプライベートにアクセスするといった仕組みにしました。
ですが、やっぱりフレンドをやりたいだけそういった仕様を準備するのは面倒です。javaの理念を理解し妥協するのも必要なようです・・・
>匿名さん
新しいもの好きですので8がリリースされたら試してみます。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。