shuto_log.aep

自分がやったことなどを備忘録的な感じで残していこうと思います。

関数の引数の型の指定を緩くする(Processing / Java)

自分はあまりプログラムを書かない方なので、もっと良い方法や指摘などがあれば教えて下さい。

やりたいこと

やりたいことは「Processingで関数を作る際に引数の型の指定を緩く指定する」ということです。どういうことかと言うと、Processingでは関数を作るときに引数の型は最初に

void aaa(int x) {
    // 処理
}

のように指定する必要がありますよね。(ここではintを指定)
これを気持ち的には

void aaa(int or String x){
    // intでもStringでもほとんど同じ処理
}

というように引数の条件を緩めるようなことをやりたいのです。(ダブってしまう内容を省略して書きたいので)

やり方と解説

そこで思いついたのは以下のような書き方です。

void aaa(Object o){
    // ダブる処理(省略)if (o instanceof Integer) {
    // int用の処理(oがintならここを通る)
    } else if (o instanceof String) {
    // String用の処理(oがStringならここを通る)
    }
    // ダブる処理(省略)
    …
}

これは、Javaにおいて、Objectクラスは全てのクラスのスーパークラスであること”と、スーパークラスの型の変数にはサブクラスのインスタンスも格納できること”を利用しています。異なる処理の部分はinstanceof演算子を用いて分岐させています。instanceof演算子は変数の中身が指定の型であるならtrueを、そうでないならfalseを返す演算子です。(instanceof演算子については語弊があるかもしれませんが、だいたいそんな感じです。詳しくは各自ググってください。

ただこのままだと、関数aaaの引数には何でもかんでも入ってしまう為、色んな人から怒られそうだったので、以下のように特定の型以外が入ってきた時は弾くようにしてみました。ここでは例としてStringとintとfloat以外はエラーを吐くようにしています。checkType関数は引数が特定の型だとtrueを、それ以外だとfalseを返します。

void aaa(Object o){
    if (!checkType(o)) {
        System.err.println("Object type is invalid.");
        return;
    }
    println(o);  // 処理
}

void setup(){
    String s = "aaaaa";
    aaa(s);  // aaaaa
    aaa(98.98765);  // 98.98765
    aaa(39);  // 39
    aaa(true);  // Object type is invalid.
}

boolean checkType(Object o){  // oが特定の型ならtrueを、それ以外はfalseを返す
if (o instanceof String) return true;
if (o instanceof Float) return true;
if (o instanceof Integer) return true;
return false;
}