rempei
@rempei

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Java オブジェクト指向 addメソッドが使えなくなる

Q&A

Closed

解決したいこと

手続き型で作ってみたプログラムをオブジェクト指向で書き換えてみようと思い試していたところ、さっそくエラーが出てきました。

発生している問題・エラー

The method add(Integer) is undefined for the type Player

該当するソースコード

public class App {
    public static void main(String[] args) throws Exception {

        Player rem = new Player();
        List<Integer> deck = new ArrayList<>(52);
        rem.add(deck.get(0));
    }    
}

//-------------------------------------------------
//今回分けたクラス

import java.util.ArrayList;
import java.util.List;

public class Player {
  List<Integer> player = new ArrayList<>();
}

例)

//分ける前はこんな感じでエラーはありませんでした。

public static void main(String[] args) throws Exception {
    
    List<Integer> deck = new ArrayList<>(52);
    List<Integer> player = new ArrayList<>();
    player.add(deck.get(0));

自分で試したこと

ここに問題・エラーに対して試したことを記載してください。

0

3Answer

『オブジェクト指向』という言葉を使うと設計概念やらが登場し始めるので、もう少し具体的に言及した回答をしておきます。
※検証環境はpaiza.ioを使用しています。

まず始めに書き換える前のコードもちゃんとオブジェクトを使用しています。
クラス図.png

『new』の宣言してArrayListインスタンスを作成していますよね。

ちなみに下のコードも実行時エラーになるので下記のように修正しておくと良いでしょう。

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // Your code here!
        List<Integer> deck = new ArrayList<>();
        deck.add(52);
        List<Integer> player = new ArrayList<>();
        player.add(deck.get(0));
        System.out.println(player.get(0));
    }
}

System.out.printlnを利用すると実行後コンソールに文字が出力できるので活用してみてください。(初心者におすすめです。)

ここでは、筆者の質問内容を『自作のクラスを作ってみたい』という質問とみなして解答しています。

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        List<Integer> deck = new ArrayList<>();
        deck.add(52);//52の番号を追加
        deck.add(43);
        
        Player player = new Player();
        player.add(deck);
        player.showDeck();
    }
}

/**
 * 自作クラスを作成
 */

class Player {
 
  //フィールドを宣言します。
  private List<Integer> deck;
  
  /**
   * コンストラクタ
   */ 
  public Player(){
       deck = new ArrayList<>();
  }
  
  /**
   * デッキに追加
   */ 
  public void add(List<Integer> arg){
       for (Integer number : arg ){
            deck.add(number);
       }
  }
  
  /**
   * デッキの番号を提示
   */
  public void showDeck(){
       for (Integer number : deck ){
           System.out.println(number);
       }
  }
  
}

参考にしてみてください。(コンストラクタはフィールドで初期化すれば不要)

2Like

Comments

  1. @rempei

    Questioner

    ご回答ありがとうございます!
    参考にさせていただきます。

よい試みだと思います。
エラーの原因ついて簡単に説明すると、addメソッドを持っているのはPlayerクラスが持つplayerプロパティであり、Playerクラス自体はそのメソッドを持っていないためです。
なので直接なり間接なり、playerプロパティのaddメソッドを呼び出す必要があります。

直接呼び出す例
public class App
{
    public static void main(String[] args) {
		Player rem = new Player();
        rem.player.add(10);
        System.out.println(rem.player.get(0)); // 10
	}
}

間接的に呼び出す例は @thi-mo さんのコードのように、仲介するメソッドを作ります。

オブジェクト指向含む設計はプログラミングの本質であり、確実な正解が無いので、いろいろな意見や回答があります。
いろいろ深い意見もあると思いますが学習を進めた先の話も多いので、まずはクラスなどの仕組みに慣れるのにとどめておくのがいいでしょう。
クラスは始めの一歩であり、そこで終わりではない、という点を押さえておけば大丈夫です。

2Like

Comments

  1. @rempei

    Questioner

    ご回答ありがとうございます!
    うまく動きました!
    また教えてもらえると嬉しいです

そりゃPlayerクラスにはaddメソッドなんてありませんので当然エラーです.

やみくもにクラスを作ることはやめましょう.
クラスは抽象化された設計ができて初めて効率的に運用できます.まずはクラスについてもっと学習し,ついで設計について学習することを推奨します.
そのうえでPlayerをどのような設計とすべきか考えましょう.
(余程出来の悪い教本でなければ,少なくとも抽象化について触れているはずです.)

1Like

Comments

  1. @rempei

    Questioner

    たしかにそうですね!もう一度しっかり学ぼうと思います。
    ちなみに、クラスにaddメソッドを持たせることは可能なのですか?
  2. メソッドの命名ということであれば, オーバーライドでもしない限り変数名とほぼ同じ制約で自由につけられます.
    いずれにせよ,目的と役割がわかりやすい名前をつけるに超したことはありません.

Your answer might help someone💌