• 締切済み

コンストラクターの引数が多い

Javaにオブジェクトとかインスタンスってあるじゃん。これを作るときの文法は決まっていて、 new コンストラクター(型 引数,型 引数,・・・); です。 ただ、モノには色々な属性(メタデータ、フィールド)があります。多いと数百数千のメタデータがあるでしょうし、今はビッグデータの時代ですから、数万数億の属性があるのかもしれません。この属性はコンストラクターの引数に相当すると思いますが、オブジェクト生成時にコンストラクター書いて引数を代入していくのでしょうか? ///// class T図書 { String タイトル,出版社,著者,用紙サイズ; int ページ数,販売額,印刷費用,重量mg,総文字数,初回発行部数,表紙の厚さmm; java.util.Calendar 発行年月日,作成年月日,構想年月日,認可年月日; T図書( String タイトル, String 出版社, String 著者, String 用紙サイズ, int ページ数, int 販売額, int 印刷費用, int 重量mg, int 総文字数, int 初回発行部数, int 表紙の厚さmm, java.util.Calendar 発行年月日, java.util.Calendar 作成年月日, java.util.Calendar 構想年月日, java.util.Calendar 認可年月日){} } class H発行{public static void main(String[] args){ java.util.Calendar h1821_11_4=java.util.Calendar.getInstance(); h1821_11_4.set(1821,11,4);//(日付セット繰り返し中略) new T図書("白い巨塔","新潮出版社","山崎豊子","A5", 345,2000,60,716,34569,20000,7, h1821_11_4,h1823_11_4,h1820_1_4,h1821_10_4); }} ///// この例だと15個です。許容範囲といえばそれまでですが、どこか違和感を感じております。そして、薬がクラスで、具体的な薬品がオブジェクトで、成分含有量がフィールドだとすると、コンストラクターの引数が莫大になると思う。 薬 ai00kity=new 錠剤薬(リプナビックスX,0,0,0,12,776,98.45,54,・・・・・); こんな感じ?

  • Java
  • 回答数2
  • ありがとう数6

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

ものには限度というものはあるし、使う方も使いずらいので、そんな無茶な引数にも、フィールドにもしないのが普通です。 別に、コンストラクタだけがフィールド設定の方法ではありません。 後から設定すればよいでしょう。 > 今はビッグデータの時代ですから、数万数億の属性があるのかもしれません コンストラクタで指定したりせずに、データベース等から読み取るのが普通でしょう。 コンストラクタでは、データベースへのアクセスに必要な情報だけ、とか。 フィールドを持たずに、今計算で必要とする属性だけを、その都度データベースから読み出し、とするのがよいでしょう。 > 薬がクラス なら、成分クラスを作って、成分クラスの配列やリストを使うのが現実的でしょう。

回答No.1

Mapに入れて渡しちゃう

関連するQ&A

  • フィールド名やメソッド名に日本語(漢字)を使う

    Javaだと、フィールド名やメソッド名に日本語を使う事が出来ます。クラス名にも漢字を使えますが、頭文字は大文字アルファベットの習慣がありますので、ここでは置いときましょう。 さて、多くのJavaプログラムでは、フィールドはメソッドに半角アルファベットを使っています。何故でしょうか?欧米人なら分かりますが、日本人は日本語が得意で、日本人プログラマーなら日本語使おうよ。 ///// class T図書 { String タイトル,出版社,著者; int ページ数; java.util.Calendar 発行年月日; T図書(String タイトル,int ページ数,String 著者,String 出版社,java.util.Calendar 発行年月日){ System.out.println("図書を発行したヨーン!"); System.out.println(タイトル+"、"+ページ数+"、"+著者+"、"+出版社+"、"+発行年月日.getTime());} } class H発行{public static void main(String[] args){ java.util.Calendar h1821_11_4=java.util.Calendar.getInstance(); h1821_11_4.set(1821,11,4); T図書 t00012=new T図書("白い巨塔",567,"山崎豊子","新潮出版社",h1821_11_4); }} ///// class Book{ String title,publisher,author; int pages; java.util.Calendar publish_day; Book(String title,int pages,String author,String publisher,java.util.Calendar publish_day){ System.out.println("図書を発行したヨーン!"); System.out.println(title+"、"+pages+"、"+author+"、"+publisher+"、"+publish_day.getTime());} } class Publish{public static void main(String[] args){ java.util.Calendar h1821_11_4=java.util.Calendar.getInstance(); h1821_11_4.set(1821,11,4); Book t00012=new Book("白い巨塔",567,"山崎豊子","新潮出版社",h1821_11_4); }} どっちが読みやすいですか?私は前者の方が読みやすいです。後者を好む日本人プログラマーは居ると思いますが、前者を望む日本人は多いと思う。

  • 実引数リストと仮引数リストの長さが異なります

    実引数と仮引数はあっているはずですが、次のエラーが出ます。どうしてでしょうか? ------エラー----------------------- java: クラス Itemのコンストラクタ Itemは指定された型に適用できません。 期待値: 引数がありません 検出値: java.lang.String,int,java.util.Date 理由: 実引数リストと仮引数リストの長さが異なります -------------------------------------------------- public class Main { public static void main(String[] args) { String name= "test"; int price = 0; Date date = new Date(); Item item = new Item(name,price,date);//コンストラクタ実引数 } } class Item{ String name; int price; Date date; void Item(String name, int price, Date date)//コンストラクタ仮引数 { this.name = name; this.price = price; this.date = date; } }

    • ベストアンサー
    • Java
  • コンストラクタの引数の中のnew?

    はじめまして☆ java初心者ですが、意味がわからなくて困っています。 オブジェクトをnewする時、たまにコンストラクタの引数部分に newの記述がある時があるのですが、これはどういう意味でしょうか? (何のオブジェクトを作成しているのでしょうか?) よかったら、教えてください。

    • ベストアンサー
    • Java
  • java コマンドライン引数を利用したカレンダー

    args[0]に例えば200805と入れたら2008年5月のカレンダーが表示される、そんなプログラムを書きたいと思っています。 理想は↓の形です。(_は空欄の意です;) 2008年5月 日 月 火 水 木 金 土 ___________1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 importは使わないよう指示が出ていますので、フルネームでカレンダークラスを記載しています。 public class CalShow { public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ java.util.Calendar cal = java.util.Calendar.getInstance(); //コマンドライン引数の前4桁をyear、 int year = Integer.parseInt(args[0].substring(0, 4)); //後ろ2桁をmonthとしてそれぞれintで定義 int month = Integer.parseInt(args[0].substring(4)); System.out.println( year + "年" + month + "月"); System.out.println(" 日 月 火 水 木 金 土"); cal.set(year, month - 1, 1); int startDay = cal.get(java.util.Calendar.DAY_OF_WEEK); cal.add(java.util.Calendar.MONTH, 1); cal.add(java.util.Calendar.DATE, -1); int lastDay = cal.get(java.util.Calendar.DATE);      /*なんとなくここまで書けたのですが、ここからどのように木曜日と1日を繋げていけばよいのか分からなくて困っています。 どういったメソッドを使えばいいのかなど、どなたか教えていただけませんでしょうか? よろしくお願いいたします。*/ } }

    • ベストアンサー
    • Java
  • C++変数宣言時のコンストラクタについて

    Java開発をこれまでやってきたのですが、 C++を学ぼうとしています。 C++では下記のように宣言した場合hogeは インスタンスになり、Hogeクラスのコンストラクタが呼ばれるようなのですが、 Hoge hoge; Hogeクラスのコンストラクタが下記のような引数を持つものしか定義されていなかった場合は どの様な振る舞いをするのでしょうか? Hoge(int num); Javaでは引数の有るコンストラクタしか宣言しなかった場合はデフォルトコンストラクタは 作られなかったと思うのですが、c++では引数のないデフォルトコンストラクタができてるのでしょうか? また、デフォルトコンストラクタが出来ていなかった場合、 Hoge hoge; というようにプリミティブ型のような変数宣言の仕方で引数有りのコンストラクタを呼ぶことは出来るのでしょうか?

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

    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
  • クラスを配列で確保する場合のコンストラクタへの引数の渡し方

    例えばコンストラクタのオーバーロードで以下のようなクラスを宣言したとします。 class testClass{ public: testClass(void){ num = 10; } testClass(int num1,int num2){ num = num1 + num2; } int num; }; オブジェクトとして宣言する場合 testClass obj(10,10); と定義とすれば、testClass(int num1,int num2)の方が適用されobj.num = 20となり、問題ありませんが、ここでobjを複数定義したい場合、obj[10]と定義すると上手く引数を渡す事ができません。 以下のような形で宣言するという手もありますが testClass obj[2] = {testClass(2,2),testClass(2,2)}; 例えば定数NUMと定義しておき、 testClass obj[NUM]; という形で宣言したい場合、どのようにすればよいでしょうか? よろしくお願いします。

  • コンストラクタの使い方?

    僕はまだJavaを勉強し始めて1ヶ月ぐらいの初心者なんですけども、現段階では基本的な文法を勉強し終えた(かなと思っている)ので、Swingのほうに早速とりかかりました。その際にすごく疑問に思ったことがあるので、皆さんにお尋ねします。 public class A ......main..... class B extends Frame{   public B(String stitle){    super(stitle);  } } super(stitle)のところでFrameクラスのコンストラクタが呼び出されていますよね。そこでFrameクラスのコンストラクタの定義を見てみると、僕が今まで学んできたような定義がなされていないんですけども。僕が今まで学んできたものというのは、 class Car {   private int num;   private double gas;   public Car()   {    System.out.println(車を作成しました。)   } } class C { ....main...   {    Car car1=new Car();   } } この場合の実行結果というのは、 「車を作成しました。」という文章が表示されはづですけど、これって言うのはSystem.out.println(車を作成しました。)のようにきちんと定義しているからですよね。それに対してFrameクラスのコンストラクタの定義には説明はあるものの、実行処理するための定義がされていないような気がするんですけども・・・。まだ僕はオブジェクト指向というものを理解できていないから、このようなわけのわからない質問をしている(と思う)のですが、よろしければどなたか分かりやすく教えてください。

    • ベストアンサー
    • Java
  • クラス中でコンストラクタを使わず変数に代入をする理由は?

    JAVAやJavascript、最近オブジェクト指向的な記述が可能になったphpなどの言語で次のようなクラス定義が可能です。 <JAVAの場合> class A { public int i1 = 1; public int i2; A() { i2 = 2; } } しかし最近覚えたC++では、例の「public int i1 = 1;」のようなクラスのスコープ内で代入を行うことは出来ず、その場所では「public int i2;」のように宣言のみ、代入はコンストラクタで行うようになっています。この場合はなぜ「public int i1 = 1;」はダメなのかと疑問に思っても「そういう仕様だ」と言われれば納得できます(やり方が1つだけなので)。 ではJAVAなどの言語で、例のような場所で「public int i1 = 1;」のような宣言と代入を行うことは、代入をコンストラクタを用いて行うこととどのような違いがあるのでしょうか?また、どちらが推奨されるのでしょうか?

  • java Calendar作成

    javaでのカレンダー作成についての質問です。 表示イメージ(_はすべて半角スペースの意です) year年month月(今回は2016年04月) _日_月_火_水_木_金_土 _______________1__2_ _3__4__5__6__7__8__9_ 10_11_12_13_14_15_16_ 17_18_19_20_21_22_23_ 24_25_26_27_28_29_30_ public class CalShow { public static void main(String[] args) { java.util.Calendar cal = java.util.Calendar.getInstance(); int year = Integer.parseInt(args[0].substring(0, 4)); int month = Integer.parseInt(args[0].substring(4)); cal.set(java.util.Calendar.YEAR, year); cal.set(java.util.Calendar.MONTH, month - 1); cal.set(java.util.Calendar.DAY_OF_MONTH, 1); //日曜日=1で土曜日=7まで int week = cal.get(java.util.Calendar.DAY_OF_WEEK); //月末日 int lastDay = cal.getActualMaximum(java.util.Calendar.DAY_OF_MONTH); System.out.println( year + "年" + month + "月"); System.out.println("_日_月_火_水_木_金_土"); //日付のない日数分回す for (int i = 1; i < week ; i ++) { System.out.print("___(半角3マス)"); } String empty; //1日から月末日まで、カレンダーを表示する for (int day = 1 ; day <= lastDay ; day ++) { empty = ""; if (day < 10) { empty = "_"; } System.out.print( empty + day + "_"); ●if ( == java.util.Calendar.SATURDAY) { System.out.println(""); } } } } ●部分で土曜日なら改行、としたいのですが、 上でint weekで土曜日=7と判明しているため、 if ( week == java.util.Calendar.SATURDAY) { とか if ( day % 7 == java.util.Calendar.SATURDAY) { など色々考え付くものを書き込んでいるのですが全く上手く動作しません。 どうしたらよいのかご教授お願いいたします・・・;;

    • ベストアンサー
    • Java

専門家に質問してみよう