アプリ版:「スタンプのみでお礼する」機能のリリースについて

static変数を持ったクラスを継承した複数のクラスで、独立してその変数を使いたい。

例えば、

class AbstractStatic{
public static String str;
}

class Ex1 extends AbstractStatic{}
class Ex2 extends AbstractStatic{}

というクラスがあったとして、

Ex1 e1 = new Ex1();
ex1.str = "hoge";

といれると、

ex2.str

で、hogeが入ってしまいます。同じようなstatic変数を持つクラスを複数作りたいのですが、継承させると、独立して変数を持たせられません。
同じようなクラスに直接static変数を、記述するしかないのでしょうか?

A 回答 (2件)

> Ex1 e1 = new Ex1();


> ex1.str = "hoge";

インスタンスを経由してクラスのstatic変数を操作するのはお勧めできません。Eclipseでそういうコードを書くと警告が出ます。static変数なら、Ex1.str = "hoge";のように書きましょう。

それはさておき、独立したstatic変数を持たせたいのであればEx1とEx2でそれぞれ宣言するしかありません。
    • good
    • 0

インスタンスの存在と無関係にクラス共通のフィールドを持たせて、



Ex1.str = "hoge";
Ex2.str = "moga";

のような書き方がしたい訳ではなく、

Ex1 ex1 = new Ex1();
ex1.str = "hoge";

のように常にインスタンスを介する使い方で、
同じクラスに属するどのインスタンスにも共通させたいが、
それぞれのクラスで宣言するのは面倒なので、
できればスーパークラスで処理を一元的に記述したいということなら、
直接フィールドにアクセスするやり方ではないが、
以下のようにスーパークラスにインスタンスメソッドのアクセッサを定義して、
Classクラスをキーにしてクラス変数のMapに格納しておく方法もある。

public abstract class AbstractStatic {
private static java.util.HashMap<Class, String> str = new java.util.HashMap<Class, String>();
public void setStr(String s) {
str.put(getClass(), s);
}
public String getStr() {
return str.get(getClass());
}
}

public class Ex1 extends AbstractStatic {
}

public class Ex2 extends AbstractStatic {
}

public class User {
public static void main(String[] args) {
AbstractStatic[] objects = {new Ex1(), new Ex1(), new Ex2()};
objects[0].setStr("hoge1");
objects[1].setStr("hoge2");
objects[2].setStr("moga");
for (AbstractStatic o : objects) System.out.println(o.getStr());
System.out.println(new Ex1().getStr());
System.out.println(new Ex2().getStr());
}
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!