凪瀬 Blog
Programming SHOT BAR

目次

Blog 利用状況
  • 投稿数 - 260
  • 記事 - 0
  • コメント - 48909
  • トラックバック - 192
ニュース
広告
  • Java開発者募集中
  • 経歴不問
  • 腕に自信のある方
  • 富山市内
  • (株)凪瀬アーキテクツ
アクセサリ
  • あわせて読みたい
凪瀬悠輝(なぎせ ゆうき)
  • Java技術者
  • お茶好き。カクテル好き。
  • 所属は(株)凪瀬アーキテクツ
  • Twitter:@nagise

書庫

日記カテゴリ

 

Java7で待望のプロパティ構文が採用される様子ですが、このプロパティにまつわる問題と歴史を見てみましょう。

Javaが出た当初

Javaのクラスにはフィールド(C#で言うメンバ変数)とメソッド(同、関数)が持てます。 もともと、Javaではpublicなフィールドというものも忌避されてはおらず、 当初はsetter,getterというアクセッサを用意するというスタイルではありませんでした。Javaが出た当初の1995年前後の話です。

例えば、古くからあるクラスのひとつとして java.awt.Pointクラスがあります。 これは2次元平面上の座標を表すクラスですが、publicなフィールドとしてxとyがあります。 そしてこの可変なフィールドに対してsetメソッドは用意されていません。 getX()、getY()は存在しますが、doubleの精度で返すというsetter,getterとは違う目的のメソッドとなっています。

しかし、publicフィールドでは読み込みと書き込みの2つを分けてアクセス権を設定することができませんでしたし、 フィールドアクセスに対して同期をとることもできませんでした。 隠蔽の観点からはフィールドをそのままpublicとして公開することはどうも得策ではない、というのは急速に知られるようになったわけです。

privateなフィールドを作り、publicなメソッドとしてsetter,getterを用意するというスタイルが定着し始めたのは 1997年後半にJava Beansの仕様が提示された後のことです。本来、Java Beansは再利用可能なソフトウェアコンポーネントを目指して 制定されたのですがあまりそちら方面の活躍は芳しくなかった覚えがあります。 Java Beansではsetter,getterスタイルであることが要求されたため、次第にこのスタイルが定着していきました。

これは、publicフィールドに対する、現実解のひとつでしたが、当然煩わしいものとなってしまいました。 IDEによる自動生成サポートなどで負担は軽減されましたが、Javaの言語設計の中でも失敗点に数えられます。

Javaへプロパティ構文が導入しにくい理由

メソッドは、そのメソッド内部で処理を追加することで、すべてのアクセスに対してなんらかの処理を行うことが容易にできます。 デバッグに際してメソッドの先頭に開始を出力するSystem.out.print()を書いたりasert文を書いたりした人も多いことでしょう。 フィールドへのアクセスは、その前後に処理を追加するようなことができません。

これは、アスペクト指向的な話題、つまりすべてのアクセスに対してなんらかの処理が追加となった際に、 フィールドアクセスに対してはなんらの効率的な手段をもたないことを意味します。 実際、フィールドアクセスに対してSystem.out.print()することができません。 こうした、アスペクト指向でいうジョインポイントを確保するという意味でもpublicフィールドを扱う設計はよろしくない。

さて、プロパティ構文の導入にあたって、見ための構文はともかく、内部的にはメソッドコールに置き換えてやる 必要性があるということになります。これはsetter,getterのアクセス権の切り分けなどが理由ですね。

ところが、JavaVMのバイトコードからしてフィールドアクセスとメソッドアクセスは違っており、 フィールドの取得はgetfield命令ですし、メソッド呼出しはinvokevirtual命令およびinvokespecial命令です。 ですから、あるクラスのフィールドを内部的にメソッドにしてしまうような手法では、そのクラスを参照しているすべての getfield命令がinvoke命令に変えられなければならず、最低でも再コンパイルが必要になってしまいます。

こうした事情から、Javaにプロパティ構文を載せることは難儀したようで、C#が2002年に出たにもかかわらず、 2008年のリリースが予定されるJava7まで随分と時間がかかってしまいました。

既存のリソースとの接合という難作業を行ったワークグループの神業に惜しみない賞賛を送りたいと思います。 (Java5.0で追加になったジェネリクスも神業と言えますね)

フィールドとメソッドを同一視すると…

クラスはフィールドとメソッドを持ちますが、例えばC#のように関数ポインタのようなものがある場合、 メソッドもつまるところ関数型のフィールドと言えてしまう。 こうした形態の最たるものがJavaScriptなどに代表されるプロトタイプベースのオブジェクト指向言語ですね。 すると、クラスというのはフィールドの配列のようなものということになってしまう。

ただ、フィールドに対して、メソッドの実行呼び出しが面倒なので構文上はシンタックスシュガーとして 簡易にメソッド呼出しができる必要がありますね。

このフィールドアクセスに対して、参照と変更、あるいは実行に対してアクセスレベルを設定でき、 またアスペクトのウィービングが可能であるのであれば、プログラム言語としてはすっきりとした仕様になるように思います。

メソッドに継承階層を持たせることを可能とすると、動的にメソッドの内容を差し替えられる静的言語が可能となります。

静的型付けであるにはクラスが保持するフィールド・メソッドの型が同じである必要がありますが 型が同じであればメソッドを切り替えることができてしまう。null値の考慮が入りますが、型の代入互換性は保てるのです。

そのような言語を考えてみるのも楽しそうですね。

投稿日時 : 2008年5月7日 21:27
コメント
  • # re: publicフィールドからプロパティまで
    じゃんぬねっと
    Posted @ 2008/05/08 10:35
    beans style property のままだと思ったのに。
  • # re: publicフィールドからプロパティまで
    シャノン
    Posted @ 2008/05/08 11:36
    C#でもフィールドですよ。メンバ変数はC++用語かと。

    > メソッドもつまるところ関数型のフィールドと言えてしまう。

    逆もまた然り。
    フィールドは、その値の取得に際して何ら副作用を持たないメソッドとする言語もあります。
    (setterがないことによってではなく、const、Javaで言えばfinalによって)変更不可能な定数であれば、public フィールドとしてもよいという方針は C# にもありますが、この場合でさえ、常に同じ値を返すメソッドと考えることもできます。

    > そのような言語を考えてみるのも楽しそうですね。

    C# でもデリゲートをプロパティないしフィールドとして公開すれば、構文上はメソッド呼び出しとまったく同じ見た目になります。
  • # re: publicフィールドからプロパティまで
    凪瀬
    Posted @ 2008/05/08 16:03
    あれー。C#ではフィールドになっていたか。このへん?
    http://msdn.microsoft.com/ja-jp/library/ms173231.aspx

    フィールド [field]
    直接アクセスできるクラスまたは構造体のデータ メンバ。

    メンバ [member]
    クラスまたは構造体で宣言されているフィールド、プロパティ、メソッド、またはイベント。

    なにやら怪しげな…。「メンバ フィールド」とか言うのかしらん。

    > 逆もまた然り。
    実装上はデータは隠ぺいされていて、プロパティはすべてメソッドとする機能性の方が作りとしては楽な気がしますね。
    ジョインポイントが作れるという点でもメリットがある。パフォーマンスを気にする人はいそうだけど。

    > そのような言語
    静的型付けなんだけど、メソッドの実装を差し替え可能になるんじゃないかな、というところにかかっているんですよ。
    いやまぁ、実際のところは委譲をすれば同じようなことができるんで、プログラムパラダイム的には新しくはないんですけどね。
  • # [C#][Java]アクセサについて
    酢酸のさっぱり日記
    Posted @ 2008/07/25 22:18
    [C#][Java]アクセサについて
  • # When I initially commented I clicked the "Notify me when new comments are added" checkbox and now each time a comment is added I get several e-mails with the same comment. Is there any way you can remove people from that service? Thanks!
    When I initially commented I clicked the "Not
    Posted @ 2021/09/05 18:14
    When I initially commented I clicked the "Notify me when new comments are added" checkbox and now each time a comment is added I get several e-mails with the same comment.
    Is there any way you can remove people from that service? Thanks!
  • # Its like you read my mind! You appear to know a lot about this, like you wrote the book in it or something. I think that you can do with some pics to drive the message home a little bit, but other than that, this is great blog. An excellent read. I'll de
    Its like you read my mind! You appear to know a lo
    Posted @ 2021/10/22 23:55
    Its like you read my mind! You appear to know a lot about this, like you wrote the book in it or something.
    I think that you can do with some pics to drive the message home a little bit, but other than that, this is great blog.
    An excellent read. I'll definitely be back. part time jobs hired in 30 minutes https://parttimejobshiredin30minutes.wildapricot.org/
  • # I've been exploring for a bit for any high quality articles or weblog posts in this sort of space . Exploring in Yahoo I ultimately stumbled upon this site. Studying this information So i'm happy to show that I have a very excellent uncanny feeling I cam
    I've been exploring for a bit for any high quality
    Posted @ 2022/01/13 2:39
    I've been exploring for a bit for any high quality articles
    or weblog posts in this sort of space . Exploring in Yahoo I ultimately stumbled upon this
    site. Studying this information So i'm happy to show that I have a very excellent uncanny
    feeling I came upon exactly what I needed. I so much undoubtedly will make certain to don?t put
    out of your mind this website and give it a glance on a relentless basis.
  • # buy cytotec online https://cytotec.club/ buy cytotec pills
    Cytotec
    Posted @ 2024/04/28 2:03
    buy cytotec online https://cytotec.club/ buy cytotec pills
タイトル
名前
Url
コメント