質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.23%

JAVA言語のプロトタイプ宣言・・・?のようなものについて。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 4
  • VIEW 2,508

taka_0407

score 8

初めまして、現在”関数型リアクティブプログラミング” 著Stephen Blackheath を読みながら勉強をしています。

その中で、一つどうしてもわからない箇所があったので、ご質問をさせていただきました。

Java言語にて、クラスの中に処理が書かれていないメソッド?のようなものがあるのですが、これがなんのために存在しているのかいまいちわかりません・・・。

C言語を以前触っており、関数を使用する前にしなければいけないプロトタイプ宣言に似たものなのかな・・・?と思いましたが、調べてみると、Java言語はする必要が無いようで、おそらく違うと見ています。

また、コードは書籍からの引用となりますので、最低限のものだけこちらに記載させていただきました。

sodiumというFRPライブラリがCentral Repositoryから参照されています。

また、他に同じディレクトリ下に6つのフォルダがあり、mavenを用いて参照されています。

一度その一行をコメントアウトすると、シンボルが見つからないというエラーが出たので、そのエラーメッセージからも少し調べましたが、これといった答えにはたどり着けませんでした・・・。

Java言語については完全に初心者ですが、どうかご教授お願いいたします。

import java.awt.Graphics;

public class Drawable {
    public void draw(Graphics g, int ht, Point orig, double scale) {};          //ここはなんのためにある・・・プロトタイプ宣言的な・・・?(なかったら動かない
    public final Drawable append(Drawable second) {
        Drawable first = this;
        return new Drawable() {
            public void draw(Graphics g, int ht, Point orig, double sc) {
                first.draw(g, ht, orig, sc);
                second.draw(g, ht, orig, sc);
            }
        };
    }
}

以下加筆いたします。
エラーが出る場合のエラーメッセージです。
最初にlsでディレクトリの中身も記載しておきます。

hogehoge:continuous taka$ ls
Animate.java    Animation.java    Drawable.java    Point.java    Shapes.java    fwoomph.java    pom.xml        target

hogehoge:continuous taka$ mvn test -Pfwoomph
[INFO] Scanning for projects...
[INFO] 
[INFO] ----------< nz.sodium.continuous-time:sodium-continuous-time >----------
[INFO] Building sodium-continuous-time 1.0.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ sodium-continuous-time ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/taka/continuous/src/main/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ sodium-continuous-time ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 6 source files to /Users/taka/continuous/target/classes
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] /Users/taka/continuous/Drawable.java:[9,22] シンボルを見つけられません
  シンボル:   メソッド draw(java.awt.Graphics,int,Point,double)
  場所: タイプDrawableの変数 first
[ERROR] /Users/taka/continuous/Drawable.java:[10,23] シンボルを見つけられません
  シンボル:   メソッド draw(java.awt.Graphics,int,Point,double)
  場所: タイプDrawableの変数 second
[ERROR] /Users/taka/continuous/Shapes.java:[25,19] シンボルを見つけられません
  シンボル:   メソッド draw(java.awt.Graphics,int,Point,double)
  場所: タイプDrawableの変数 dr
[ERROR] /Users/taka/continuous/Shapes.java:[33,19] シンボルを見つけられません
  シンボル:   メソッド draw(java.awt.Graphics,int,Point,double)
  場所: タイプDrawableの変数 dr
[ERROR] /Users/taka/continuous/Shapes.java:[41,20] シンボルを見つけられません
  シンボル:   メソッド draw(java.awt.Graphics,int,Point,double)
  場所: タイプDrawableの変数 drb
[ERROR] /Users/taka/continuous/Shapes.java:[42,20] シンボルを見つけられません
  シンボル:   メソッド draw(java.awt.Graphics,int,Point,double)
  場所: タイプDrawableの変数 dra
[ERROR] /Users/taka/continuous/Animate.java:[26,26] シンボルを見つけられません
  シンボル:   メソッド draw(java.awt.Graphics,int,Point,double)
  場所: クラス Drawable
[INFO] 7 errors 
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.696 s
[INFO] Finished at: 2018-10-04T16:41:32+09:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project sodium-continuous-time: Compilation failure: Compilation failure: 
[ERROR] /Users/taka/continuous/Drawable.java:[9,22] シンボルを見つけられません
[ERROR]   シンボル:   メソッド draw(java.awt.Graphics,int,Point,double)
[ERROR]   場所: タイプDrawableの変数 first
[ERROR] /Users/taka/continuous/Drawable.java:[10,23] シンボルを見つけられません
[ERROR]   シンボル:   メソッド draw(java.awt.Graphics,int,Point,double)
[ERROR]   場所: タイプDrawableの変数 second
[ERROR] /Users/taka/continuous/Shapes.java:[25,19] シンボルを見つけられません
[ERROR]   シンボル:   メソッド draw(java.awt.Graphics,int,Point,double)
[ERROR]   場所: タイプDrawableの変数 dr
[ERROR] /Users/taka/continuous/Shapes.java:[33,19] シンボルを見つけられません
[ERROR]   シンボル:   メソッド draw(java.awt.Graphics,int,Point,double)
[ERROR]   場所: タイプDrawableの変数 dr
[ERROR] /Users/taka/continuous/Shapes.java:[41,20] シンボルを見つけられません
[ERROR]   シンボル:   メソッド draw(java.awt.Graphics,int,Point,double)
[ERROR]   場所: タイプDrawableの変数 drb
[ERROR] /Users/taka/continuous/Shapes.java:[42,20] シンボルを見つけられません
[ERROR]   シンボル:   メソッド draw(java.awt.Graphics,int,Point,double)
[ERROR]   場所: タイプDrawableの変数 dra
[ERROR] /Users/taka/continuous/Animate.java:[26,26] シンボルを見つけられません
[ERROR]   シンボル:   メソッド draw(java.awt.Graphics,int,Point,double)
[ERROR]   場所: クラス Drawable
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Udomomo

    2018/10/04 16:37

    その一行をコメントアウトしたときに出たエラーメッセージを、そのまま載せていただけますか?

    キャンセル

  • taka_0407

    2018/10/04 16:52

    Udomomoさん、Apache mavenというプロジェクト管理ツール?を用いていて、少し長くなってしまいますが、加筆させていただきました。どうぞ、よろしくおねがいたします。

    キャンセル

回答 1

checkベストアンサー

+6

まず匿名クラスについて知らなければなりません。

return new Drawable() {
    public void draw(Graphics g, int ht, Point orig, double sc) {
        first.draw(g, ht, orig, sc);
        second.draw(g, ht, orig, sc);
    }
};

ここでreturnされているのは、Drawableを継承する無名のクラスのインスタンスです。
これは次のように書いているのと動作としては同じです。

class Tmp extends Drawable {
    @Override
    public void draw(Graphics g, int ht, Point orig, double sc) {
        first.draw(g, ht, orig, sc);
        second.draw(g, ht, orig, sc);
    }
}

return new Tmp();

drawメソッドが継承されるので、元のクラスにも当然宣言が無ければいけません。
そういう意味では、Cのプロトタイプ宣言に似ているところもあります。

ただし、Drawableクラスは具象クラスとして定義されています。
drawメソッドも実装される必要があり、ここでは『何もしない』メソッドとされているようです。


クラスの役割が混在しているのが分かりづらさの要因のような気がします。

  • 『何かを書く』一連の処理を持つ役割
  • 処理同士を結合する役割

せめてappendメソッドはstaticにした方が分かり易いと思うんですがね。
こんなイメージで。

@FunctionalInterface
interface Drawable {
    void draw(String str);

    static Drawable concatenate(Drawable... tasks) {
        return (str) -> {
            for(Drawable task: tasks) { task.draw(str); }
        };
    }
}

class Main {
    public static void main(String[] args) {
        Drawable task1 = (str) -> System.out.println("task1: " + str);
        Drawable task2 = (str) -> System.out.println("task2: " + str);
        Drawable task3 = (str) -> System.out.println("task3: " + str);

        Drawable.concatenate(task1, task2, task3).draw("hoge");
    }
}

実行結果 Wandbox

task1: hoge
task2: hoge
task3: hoge

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/05 11:27

    LouiS0616さん、ご回答ありがとうございます!!!
    匿名クラスとoverrideについて調べて見たらスッキリしました!
    オーバーライドと同じ動作をして、上書きするための元のメソッドが必要なんですね・・・!
    いただいた仮に名前をつけたTmpクラスでインスタンスを作ったものをreturnしているという例もとても分かりやすく、改善例までだしていただき、ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る