講義編5
「Java における定数の扱い」
 
← 前  :  次 →

C 言語では,プリプロセッサが存在するため「#define apon 5」のように 定数の値を書くことができます. #もちろん const 指定のグローバル変数でも良いですが. そしてそれらはヘッダ・ファイルにまとめられて,複数の C ファイルから 利用(インクルード)されます.

「tts_os21.h」

#ifndef __TTS_OS21_H__
#define __TTS_OS21_H__

#define TTS_VOICE_FEMALE 1
#define TTS_VOICE_MODE_PITCH 2
#define TTS_VOICE_MODE_SPEED 0
#define TTS_VOICE_MODE_ACCENT 1

#endif /*__TTS_OS21_H__*/

しかし Java では,このように便利な機能はありません.もちろん,どのクラスにも 属さない変数(→グローバル変数)は存在できません. それでは,C 言語のヘッダ・ファイルのような,どのクラスからも利用できる 変数を用意するにはどうしたら良いのでしょうか?

クラス変数だけを保持している,クラスを作成しておくのも1つの方法です. 「public static final」修飾子を付けた変数は

といった属性を持つことになります.つまり定数です. この「定数表現」クラスを,そこかしこで static 参照すれば目的は果たせます. ですが,これでは「このクラスは「定数表現」クラスを利用していたっけ?」という 情報がすぐには得られません.

クラスの情報は,やはりクラス定義の箇所で確認したいものです. つまり「public class HireHare extends HaraHoro」の部分で,です. 例えばこのクラス情報は「public 指定で,HaraHoro クラスを継承している」 というコトが一目瞭然です.

それならば利用したいクラスで「定数表現」クラスを継承させてあげれば 良いのかもしれません. 「public class クラス名 extends 定数表現」とすれば,どんな定数群を 使用しているか とても判りやすくなります.

ただし,Java には多重継承がありません. 既にほかのクラスを継承しているクラスは,「定数表現」クラスを新たに 継承することは不可能です. ちなみに「extends」指定を省略したクラスは,全て「java.lang.Object」の サブ・クラスとして扱われます. Object クラスは,全てのクラスの頂点にいます.

 

さて,ここで◆講義編1で復習した「参照型」について,もう一度おさらいです. 「参照型」には,以下の3種類があることは既知のことだと思います.

この中の3番目,「インタフェース型」とは何でしょうか?

インタフェースは,対象となる「もの」の 仕様 だけを制定した クラスの一種です. 通常のクラスでは動作(メソッド)を設定したら,その振る舞いを キチンと定義しなければなりません.その動作が何もしないのであれば, 「何もしない」という定義になります. また抽象クラス(「abstract」修飾子のあるクラス)では, 振る舞いを定義しなくても良い動作(「abstract」修飾子のあるメソッド)が 許されています. ただし,その場合には継承したサブ・クラス以降で必ず定義することが条件.

この抽象クラスを,さらに骨格だけにしたものがインタフェースです. インタフェース内の属性は全て「public static final」修飾子が付加され, その動作は全て「public abstract」修飾子の付加により抽象メソッドとなります.

長々と書きましたが,つまり C 言語のヘッダ・ファイルに近いもの (定数群を列挙してあるもの)を用意するときはインタフェースを使いましょう. たとえば,その最たる例に「javax.swing.SwingConstants」インタフェースが あります.
インタフェースには多重継承禁止のような制限はありません. いくつでも好きなだけ「実装」することができます. そして C++ のような多重継承の代わりとなる手法が,このインタフェースです.


表紙へ戻る