• ベストアンサー

ある特定の値(変数)を持たせたい時のクラスの設計法は?

例えば、「人」クラスと、それを拡張した「杉山」、「鈴木」等具体的な名前を与えるクラスを設計する時、「名前」にあたるものはクラスを作った時点で分かるはずです。 また、「人」クラスをスーパークラスとして持つことも共通しています。 こういった場合、名前にあたる変数はどのように実装するべきなのでしょうか? 例えば、 class Person{ } class Suzuki extends Person{ String name = "suzuki"; } のように、するべきなのか class Person{    STring name_;    void setName(String name){       name_ = name;    } } class Suzuki extends Person{    setName("Suzuki"); } のようにするべきなのか、何がベターなのかよく分かりません。 出来れば、Personクラスを拡張したクラスには、忘れないようにnameフィールドに値を入れるようにしたいのですが、抽象クラスも何か違うのかなぁ…と(よく分かりませんが)。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.5

いっそこんなのはどお? enum Person { Sugiyama,Suzuki } これを Person.Suzuki.toString() とすれば Suzikiを得られるわよ。 日本語もOK enum Person { Sugiyama,Suzuki,岡田,山本 }

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

  • e00083
  • ベストアンサー率31% (25/80)
回答No.6

>抽象クラスも何か違うのかなぁ…と(よく分かりませんが)。 使用の目的や持たせたい情報量でインターフェースを使うか、抽象クラスを使うか変わってきます。 ただ、abstractを使えないので、ただのクラスから継承するのは、個人的に理解できません。 ベターを追及するなら、クラス設計のデザインパターンの勉強をお勧めします。

全文を見る
すると、全ての回答が全文表示されます。
回答No.4

クラス名を取得してしまえば済む話、じゃないんでしょうか? --------classtest.lava------- import java.lang.Class; public class classtest { public static void main(String[] args) { Person myPerson = new Person(); Suzuki mySuzuki = new Suzuki(); String name; Class cls; cls = myPerson.getClass(); name = "myPerson"+ "\n" + " getCanonicalName=" + cls.getCanonicalName() + "\n" + " getName=" + cls.getName() + "\n" + " getSimpleName=" + cls.getSimpleName() + "\n" ; System.out.println( name ); name = "mySuzuki"+ "\n" + " getCanonicalName=" + mySuzuki.getClass().getCanonicalName() + "\n" + " getName=" + mySuzuki.getClass().getName() + "\n" + " getSimpleName=" + mySuzuki.getClass().getSimpleName(); System.out.println( name ); } } --------Person.java------------ public class Person{ Person(){ } } ------Suzuki.java----------- class Suzuki extends Person{ Suzuki(){ } } --------実行結果-------- C:\java>java -classpath c:\java classtest myPerson getCanonicalName=Person getName=Person getSimpleName=Person mySuzuki getCanonicalName=Suzuki getName=Suzuki getSimpleName=Suzuki C:\java>

全文を見る
すると、全ての回答が全文表示されます。
  • foggi47
  • ベストアンサー率87% (7/8)
回答No.3

Personのコンストラクタを引数ありにしたらどうでしょう 場合によってprotectedにすればいいかと class Person{ private String name; protected Person(String name){ this.name=name; } } class Suzuki extends Person{ public Suzuki(){ super("Suzuki"); } } ケータイから打ってるので間違いあるかもしれませんがイメージは伝わると思います

全文を見る
すると、全ての回答が全文表示されます。
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

上記の例ではnameフィールドはインスタンスフィールドのように見えますが、それで合っていますか? たとえばSuzukiクラスのインスタンスを作ったときに、 s1 = new Suzuki(); s2 = new Suzuki(); s1とs2では異なる名前を持たせられるようにしたいのでしょうか。それともSuzukiクラスの全てのインスタンスは同じ名前を共有する前提でしょうか。

nabewari
質問者

お礼

回答ありがとうございます。 同じ名前を共有します。

全文を見る
すると、全ての回答が全文表示されます。
  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

>Personクラスを拡張したクラスには、 >忘れないようにnameフィールドに値を入れるようにしたいのですが そのようなフィールドが必要だとは思われません。 クラス名が欲しければリフレクションを使えばよいのではないですか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • スーパークラスの取得の仕方

    どなたかお知恵を貸してください。 現在抽象クラスを作って表示をさせる実験をしています。 ですが、下記ソースでは、取得したnameをが参照することができません。 どのようにすれば、たまの名前を出すことが出来るのでしょうか よろしくお願いいたします。 abstract class Mammals { /** 名前を表す */ String name; abstract public void introduceOneself(); public void setName(String name) { name = name; } } class Cat extends Mammals { public Cat() { super(); } public void introduceOneself() { System.out.println(name+"です。うにゃにゃ。"); } } class Main { public static void main (String[] args) { Cat tama = new Cat(); //コンストラクタ呼び出し Mammals neko = tama; //コンストラクタ呼び出し neko.setName("たま"); //自己紹介する tama.introduceOneself(); //自己紹介する } }

    • ベストアンサー
    • Java
  • javaのEclipseの問題がわからない

    Human.javaで記述されたクラスを継承し、継承したクラスをインスタンス化して、利用できるHumanクラスのメンバをすべて使用するプログラムを作成せよ。クラス名は、継承したクラスをPerson とし、そのクラスをインスタンス化するクラスをQuestion13_1として、実行結果も記述すること public class Human { private String name = "デフォルトの名前"; protected int age = 22; public int height = 170; final public int weight = 55; public String GetName(){ return name; } public void setName(String name){ this.name = name; } } 結果何を出せば良いのわかりません。

  • データベース(テーブル情報)操作方法に関して

    まだJAVAを初めて1ヶ月ちょいの初心者です。ぜひ教えて頂きたいことがあります。 データベースのテーブル操作に関してなんですが、どうコーディングしたら効率のよいプログラムになるのか検討段階でつまずいています。 今考えているのが、スーパークラスにてテーブルの各カラム変数を宣言し、そのサブクラスにてテーブル操作毎のSQL発行(スーパークラスから継承した抽象メソッドを用いて)をしたほうがいいのかなと考えてます。 つまり・・・ ----<<super class(抽象クラス)>>----- public abstract class InfoTable { private String name; private int age; : public String getName() { return Staff_ID; } public String setName(String name){ this.name = name } //抽象クラス(SQLを発行しテーブルを操 //作する抽象メソッド) public abstract boolean exec(); } とし、サブクラスにて継承&実装すればよいのかと・・・。 実際にテーブルのカラムが多くなれば、setter・getterを多く繰り替えし処理をしなければならなくなり、それは大変だし、プログラム的にもよくないんじゃないかと考えています。実際にサブクラスはサーブレットからデータを取得してから処理を行う予定なので、Vectorを使えばいいのかなとは思いますが、どう使ったらよいのか検討がつきません。 長々と書いてしまい申し訳ございません。 どなたか良い知恵をお貸し下さい!

    • ベストアンサー
    • Java
  • static変数を持ったクラスを継承した複数のクラスで、独立してその変

    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変数を、記述するしかないのでしょうか?

    • ベストアンサー
    • Java
  • サーブレッドでのローカル変数はスレッドセーフだと聞きましたが、

    サーブレッドでのローカル変数はスレッドセーフだと聞きましたが、 オブジェクト型のローカル変数にもそれは当てはまるのでしょうか。 例えば下記の実行クラスにユーザAとユーザBが同時にアクセスした場合、どうなるのでしょうか。 手順 (1)ユーザAが実行クラスのtestMethodを実行し、TestBean.setNameメソッドで名前をセットする (2)その直後にユーザBがtestMethodを実行し、TestBean.setNameメソッドで名前をセットする (3)ユーザAがセットした名前はユーザBに上書きされてしまうのか? ------------------------------------------------- ○実行クラス public class TestClass{   public String testMethod(){     TestBean testBean = new TestBean();     testBean.setName("テスト太郎");     return testBean;   } } ------------------------------------------------- ○呼び出されるBeanクラス public class TestBean{   private String name = null;     public void setName(String name){     this.name = name;   } } ------------------------------------------------- わかり難い説明で申し訳ないのですが、教えていただけないでしょうか。

    • ベストアンサー
    • Java
  • コンポジション コンストラクタに引数がある場合

    class Person{ public String name_; public int age_; public Person(String n,int a){ name_ = n; age_ = a; } } class Student{ public Person person_; public int grade_; public Student(Person p,int g){ person_ = new Person("MOTO",2); grade_ = g; } } public class Samconp2{ public static void main(String[] args){ Student asaya_ = new Student(p,0); } System.out.println(asaya_.person_.name+asaya_.person_.age_+asaya_.grade__); } 3のプログラムを見るようにコンストラクタに引数使い、又継承を使わないでPerson クラスのname_ age_ それを拡張したStudetクラスのgrade_をmain関数で表したいのですが(希望としてはname_ "Moto" age_ 2 grade_ 0) 結果としては、System.out.println(asaya_.personn_.name_ + asaya_.person_.age_ +asaya_grade_);で<identifierがありません>となります。 まだ初心者で良く分りません。解決方法をお願いします。

    • ベストアンサー
    • Java
  • コンポジションについて

    public class Person{ public String name_ ; public int age_ ; public Person(){ name_ = "Asaya"; age_ = 61; } } public class Student{ public Person person_; public int grade_; public Student(){ person_.name_ = "Moto"; person_.age_ =2; grade_ = 0; } } public class SamConp1{ public static void main(String[] args){ Person person_ = new Person(); Student asaya_ = new Student(); System.out.println(asaya_.person_.name + asaya_.person_.age_+asaya_.grade__); } } 3つのプログラムを見るようにコンストラクタに引数を使わず、又継承を使わないでPerson クラスのname_ age_ それを拡張したStudetクラスのgrade_をmain関数で表したいのですが(希望としてはname_ "Moto" age_ 2 grade_ 0) 結果としては、 exception in thread "main" java.lang.nullpointerexception at student.<int>(Student.java:6) at SamConp1.main(SampConp1.java:4) となります。 まだ初心者で良く分りません。解決方法をお願いします。

    • ベストアンサー
    • Java
  • クラスの拡張について

    Teacher クラスを変更し、newTeacher()の時は、名前「TARO」、年齢「25」、科目「国語」で初期化し、newTeacher(名前、年齢、科目)のときはそれぞれのパラメータでオブジェクトを作るようにしたい。 Person クラスのコンストラクタが使ってもかまわない という問題で //ClassRoom3.java class Person{ String name; int age; Person(String name,int age){ this.name = name; this.age = age; } void print(){ System.out.println("[Name]"+name); System.out.println("[age]"+age); } } class Teacher extends Person{ String subject; void print(){ System.out.println("私は"+name+" といいます。"); System.out.println("年齢は"+age+" 才です。"); System.out.println(subject+" を教えています。"); } } class ClassRoom3{ public static void main(String args[]){ Teacher obj1 = new Teacher(); Teacher obj2 = new Teacher("JIRO",27,"算数"); obj1.print(); System.out.println(); obj2.print(); } } /* 実行例 >java ClassRoom3 私は TARO といいます。 年齢は 25 才です。 国語 を教えています。 私は JIRO といいます。 年齢は 27 才です。 算数 を教えています。 */ という出力結果をだしたいのですが、なんどもやっても失敗してしまい。なかなかできません。 どう直したらよいのですか?

  • スレッドセーフ?スレッドアンセーフ?

    Struts2にてスレッドセーフを勉強しており 以下のコードがスレッドセーフなのか、それともスレッドアンセーフなのかご意見を頂きたいと思います。 個人的な意見ですが、インスタンス変数を利用しているためスレッドアンセーフになるのではないかと思いますが間違いございませんでしょうか。 //以下 Struts2 public class InsertProgram extends ActionSupport implements ServletRequestAware{ private Test test = new Test(); private String id; private String name; public class execute(){ id     = request.getParameter("id"); name = request.getParameter("name");        //以下がご意見を頂きたい箇所です。 test.setId(id); test.setName(name); test.insert(); return SUCCESS; } } public class Test{ private String id; private String name; public String getId() { return id; } public String getName() { return name; } public void setId(String id) { this.id = id; } public void setName(String name) { this.name = name; } public class insert() { //割愛致します。 データベースにid 及び name をinsert します。 sql = "Insert into test_db(id , name) ・・・" } }

    • ベストアンサー
    • Java
  • インタフェイス実装と抽象クラス継承を同時に使うには??

    私はjava初心者です、今練習問題で困っています。 1つのクラスに抽象クラスとインターフェイスを 実装することはできるのでしょうか? 例えば abstract class Car { private String gas; public void getGas(int gas) { this.gas = gas; } public abstract void enjin(); } interface Flying extends Pet { void show(); } 上のインタフェイスと抽象クラスを同時に下のクラスに継承、実装しよう とすると、どんな風にかけば良いのでしょうか class Zoon { public Zoon() { super(); } public void enjin() { System.out.println("どどどどど"); } public void show() { System.out.println("いいくるまだ"); } }

    • ベストアンサー
    • Java