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

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

ただいまの
回答率

87.61%

列挙型クラスにおいてMainクラスからの入力値を代入したい

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 207

score 9

Mainクラスより月と日を入力して
列挙型のConstellation にて定義でしている
誕生日の星座をgetType()にてMainクラスに渡したいのですが。

//入力値を代入したい
上記の箇所にMainクラスからの入力した月、日 それぞれ代入したいのですが
Constellation においてどの変数に代入すればよいか見当がつかない状態です。

星座の条件分岐については
列挙型のConstellationにて定義することを考えております。

なお、条件分岐させた後、表示としては以下のようにしたいです。
(例)
1996年4月24日生まれの人の星座は牡牛座

enum Constellation内にて、何か定義しないといけないものがあれば
ご教授お願い致します。

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        int year;
        int month;
        int dayOfMonth;
         Scanner scanner = new Scanner(System.in);
            System.out.println("**********星座判定**********");
            System.out.println("誕生年を入力してください");
            year = scanner.nextInt();
            System.out.println("誕生月を入力してください");
            month = scanner.nextInt();
            Constellation.setMonth(month);
            System.out.println("誕生日を入力してください");
            dayOfMonth = scanner.nextInt();
            Constellation.setDay(dayOfMonth);
      //System.out.println(year+”年”+month+”月”+dayOfMonth+”日生まれの人の星座は”+getType());と記述する予定


    }

}
import java.time.MonthDay;

public enum Constellation {
    Aries("牡羊座", 3, 21, 4, 19), 
    Taurus("牡牛座", 4, 20, 5, 20),
    Gemini("双子座", 5, 21, 6, 21), 
    Cancer("蟹座", 6, 22, 7,22), 
    Leo("獅子座", 7, 23, 8, 22), 
    Virgo("乙女座", 8, 23, 9, 22), 
    Libra("天秤座", 9, 23, 10, 23), 
    Scorpio("蠍座", 10,24, 11, 22), 
    Sagittarius("射手座", 11, 23, 12, 21), 
    Capricorn("山羊座", 12, 22, 1,19), 
    Aquarius("水瓶座", 1, 20, 2, 18),
    Pisces("魚座", 2, 19, 3, 20);

    //フィールド設定
    private String type;
    private MonthDay startDay;
    private MonthDay endDay;

    //コンストラクタ
    private Constellation(String type, int startMonth, int startDay, int endMonth, int endDay) {
        this.type = type;
        this.startDay = MonthDay.of(startMonth, startDay);
        this.endDay = MonthDay.of(endMonth, endDay);
    }

    //setterメソッド 入力値を受け取る
    static void setMonth(int month){
    //入力値を代入したい

    }
    static void setDay(int day){
    //入力値を代入したい
    }    

    //getterメソッド
    public MonthDay getstartDay()     {
        return startDay;
    }
    public MonthDay getendDay() {
        return endDay;
    }
    public String getType() {
        return type;
    }

}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • BeatStar

    2021/07/24 19:42

    単にsetMonthメソッドとかの中身を書きたいだけなら、単純にコンストラクタと同じように書けばいいだけでは?

    キャンセル

回答 2

+3

私なら enum を Factory のようにはせずに、単に public static Constellation get(int month, int dayOfMonth) { ~ } というメソッドを Constellation に作るでしょう。

例:

    public boolean match(int month, int dayOfMonth) {
        MonthDay target = MonthDay.of(month, dayOfMonth);
        return !(endDay.isAfter(startDay)
                ? target.isBefore(startDay) || target.isAfter(endDay)
                : target.isBefore(startDay) && target.isAfter(endDay));
    }
    public static Constellation get(int month, int dayOfMonth) {
        Constellation cons[] = values();
        for(int i=0; i<cons.length-1; i++) {
            if(cons[i].match(month,dayOfMonth)) return cons[i];
        }
        return cons[cons.length-1];
    }
    Constellation cons = Constellation.get(month, dayOfMonth);
    System.out.println(year+"年"+month+"月"+dayOfMonth+"日生まれの人の星座は"+cons.getType());

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2021/07/26 00:47

    年をまたぐ山羊座だけmatchメソッドをオーバーライドするほうがわかりやすいと思いますがいかがでしょう。

    キャンセル

  • 2021/07/26 01:42

    そのようなコードもやったのですが、オーバーライドしたメソッドからはstartDay/endDay フィールドにアクセスできなかったんですね。
    getter は使えるんですが、そうするとコピペして || → && だけ変えるというオーバーライドの目的個所以外も修正することになるので、どうが良いかと少し悩んだ所でした。
    論理演算オブジェクトを作ってコンストラクタで切り替えておくのも試したのですが・・・大袈裟かなぁとも ^^;

    abstract class LogicalOp {
    static LogicalOp and = new LogicalOp() { public boolean op(boolean a, boolean b) { return a && b; } };
    static LogicalOp or = new LogicalOp() { public boolean op(boolean a, boolean b) { return a || b; } };
    abstract boolean op(boolean a, boolean b);
    }
    :
    lop = start.isBefore(end) ? LogicalOp.or : LogicalOp.and;
    :
    return !lop.op(target.isBefore(start), target.isAfter(end)); //Not 範囲外

    キャンセル

  • 2021/07/26 02:03

    > オーバーライドしたメソッドからはstartDay/endDay フィールドにアクセスできなかった
    "Constellation.this." を付ければアクセス出来たかもしれません。…修正しないといけないというのは getter 使用と同じですが getter よりはメソッドじゃない分多少は…まぁ、個人的微妙な選択です。

    キャンセル

  • 2021/07/26 07:21 編集

    2019年の回答のZodiacでしょうか?enumは普通のクラスなのでポリモーフィズムを活用することができる。
    失礼しました。今回はgetterを使えばよろしいかと思います。

    キャンセル

+1

    //setterメソッド 入力値を受け取る
    static void setMonth(int month){
    //入力値を代入したい

    }
    static void setDay(int day){
    //入力値を代入したい
    }  

こいつをやめる。そしてこうする。

    static void setMonthAndDay(int month, int day){
    // 中身はおまかせします。
    }  

ただし。Constellation.Ariesのインスタンスがひとつだけしか作られない。シングルトン。そこに値を設定して構わないのですか。
やればできるけれど、わたしはそんなことはやりませんね。ConstellationとMonthDateをもつ別の型を定義します。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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