Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

Enumでinterface継承時のstaticメソッド

こんにちは。お世話になります。

public interface EnumIF{

}

public enum EnumA implements EnumIF{
    A_1(1),
    A_2(2);
}

public enum EnumB implements EnumIF{
    B_1(1),
    B_2(2)
}

上記のようにenumとinterfaceを作成しました。

EnumIF.getEnum(1, "B"); //EnumBのenum、B_1を返却させたい

のようなメソッドを作成したいのですが、どうメソッドを実装すればよいのかがわかりません。
interfaceにはstaticメソッドを実装できませんし、
enumはinterfaceしか継承できないのでやりかたがわからず困っております。なにかよい方法はありますでしょうか?

どうかご指導お願い致します。

12

回答

7910

閲覧

12件の回答

評価

0

訳のわからんコードだな。

クラス、インターフェース、メソッド、
それから継承と実装について、
ちゃんと勉強した方がいいよ。

まだ始まったばかりなんでしょ。

評価

0

>不良社員様

レスありがとうございます。
ということは、こんなこと普通はしないんですね。。。

経緯をもう少し詳しく書きます。

今まで、クラスAのなかにメンバ変数「yasai」があり

public final int DAIKON = 1;
public final int NINJIN = 2;
・・・
と定数があり、
if(ClassA.YASAI == XXX){
//似たような処理
}elseif(ClassA.YASAI == YYY){
//似たような処理
}elseif
・・・
としていましたが冗長なので、前述のEnumAを作成し、

for(EnumA key : EnumA.values()){
//似たような処理
}

とif文連打を変更して使用していました。

で、さらに処理として、野菜以外に果物が追加されることになりました。

メンバ変数「kudamono」を追加してもよかったのですが、今後もお菓子「okasi」などが追加されるかもしれないです。なのでメンバ変数「yasai」を「tabemono」にして、インターフェース「Tabemono」(前述のEnumIF)を作成しました。そうすれば

String syurui = "yasai"
for(Tabemono key : Tabemono.values("yasai")){

}
として出来るかな〜?と。この
Tabemono.values(String syurui)
が作成できなくて困っていました。

普通はどうするものなんでしょう?

なにかアドバイスかヒントをいただければ、と思います。
よろしくお願い致します。


評価

0

書き間違いました。上記の if(ClassA.YASAI == XXX){ 
のXXXはDAIKONなりNINJINです(お分かりにはなると思いますが、一応)。

評価

0

ポリモーフィズムとか多態性について勉強すればよい。

たまにはサービスしてみるか。

interface Kuimono {
  public void execute();
}

class Yasai implements Kuimono {
  public void execute() {
    //種類毎にクラスを作るか、IDで分岐するかは好きしな。
  }
}

class Kudamono implements Kuimono {
  public void execute() {
    //種類毎にクラスを作るか、IDで分岐するかは好きしな。
  }
}

class Hoge {
  public static void main(String[] args) {
    Kuimono ichigo = new Yasai();
    Kuimono satsumaimo = new Yasai();
    Kuimono mikan = new Kudamono();
    Kuimono ringo = new Kudamono();
    List<Kuimono> list = new ArrayList<Kuimono>();
    list.add(ichigo);
    list.add(satsumaimo);
    list.add(mikan();
    list.add(ringo);
    for(Kuimono kuimono: list) {
      kuimono.execute();
    }
  }
}

こんなところか。

評価

0

あまり理解してないが。

public enum Kuimono {
    DAIKON("yasai"), NINJIN("yasai"),
    MIKAN("kudamono"), RINGO("kudamono");
    private String _kind;
    private Kuimono(String kind) {
        _kind = kind;
    }
    public String getKind() {
        return _kind;
    }
    public static Kuimono[] values(String kind) {
        List<Kuimono>list = new ArrayList<Kuimono>();
        for (Kuimono k : values())
            if (k.getKind().equals(kind))
                list.add(k);
        return list.toArray(new Kuimono[list.size()]);
    }

    public static void main(String[] args) {
        for (Kuimono k : Kuimono.values("kudamono"))
            System.out.println(k.name());
    }
}

こんなのが欲しいのか?

評価

0

>不良社員様

レス有難うございます。

きちんと理解できているか自信がありません。。
説明不足の点もあったかもしれないので補足の意味もこめてソースかいてみました。

class ClassA{
    
    public String syurui;

    public List<Kuimono> getKuimonoList(){
        if(this.syurui == "野菜")
            return Yasai.getList();
        elseif(this.syurui == "果物")
            return Kudamono.getList();
    }
}


interface kuimono {
    public void execute();
}

// Kudamonoも同様
class Yasai implements Kuimono {
    
    public final int DAIKON = 1,
    public final int NINJIN = 2;

    public List<Kuimono> getList(){
        List<Kuimono> list = new ArrayList<Kuimono>;
        list.add(DAIKON);
        list.add(NINJIN);
        return list;
    }

    public void execute() {
        //処理
    }
}


class Hoge {
  public static void main(String[] args) {
    
    ClassA clsA = new ClassA();

    ClassA.syurui = "野菜"; //ここは本来は他の処理によって既に決まっている

    List<Kuimono> list = ClassA.getKuimonoList();
 
    for(Kuimono kuimono: list) {
      kuimono.execute();
    }
  }
}

だいたい合ってますでしょうか?
まだ少しまわりくどいやり方をしてるような気がしてます・・・。

評価

0

>$様

ありがとうございます。まさにそれでした!

同じ事をやるにしても色々な書き方があるのですね。
大変勉強になりました。


お二人ともありがとうございました!

評価

0

俺の出番はもう終わったようだが、一言だけ。

>だいたい合ってますでしょうか?

俺は、勉強しようといったはずだ。
サンプルを当てずっぽうにいじくるだけなんて、やる気あんのか?

2度とすんなよ。

評価

0

>勉強しようといったはずだ。
これは私からも言っておくよ。
たまたま、サンプルが目当てのものだったようだけど、これを適当に組み込んで使うだけじゃ何の意味もない。

また、「勉強になりました」って過去形になっているが、ある仕組みを実装する方法には大抵の場合それと同じか、もっと効率的な方法があるものだ。
ちゃんとそれぞれのコードを理解し吸収して、さらに何かないかを考えていかないと。

評価

0

不良社員は最後の最後に無駄にとげがあるな
何様なのこの人

同じとげでも$のが建設的な意見だし

評価

0

>不良社員様、$様
おっしゃる通りです。自分で頭使わなきゃ、勉強になんてならないですね。有難うございます。
私は不良社員様の「とげ」はいつも愛のムチと受け取っております(w

評価

0

適格な回答をしてくれたわけだから愛のムチと受け取るべきですよね。私も以前この掲示板でお叱りを受けましたが、とても良い経験になっております。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。