ひとりプロジェクトでたとえばATMプログラムを作成していると仮定して、
ATMの入力画面や入金画面を作るさい、各メソッドをstaticで宣言しますか?それともnewで宣言しますか?
個人的には入力画面はクラス固有の機能なのでstaticを利用しますが、メモリのことを考えればnewのほうがいいと思います。
newとstaticどちらを利用するのが普通ですか?
newできるものはnewにしたほうがいいのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
ATMの入力画面や入金画面を作るさい、各メソッドをstaticで宣言しますか?それともnewで宣言しますか?
staticで宣言しません。ATMは出張所/支店に属している端末です。
あくまでも出張所が設置している端末(ATM)が一台であるだけです。
◇staticかどうかの考え方です。
1.そのオブジェクトは本当に一つだけですか?
クラス間の接続部分(インターフェイス)が一つに見えるだけじゃないですか?
2,複数のオブジェクトから一つのオブジェクトを返すように変更するのは簡単ですが、
一つのオブジェクトから複数のオブジェクトを返すように変更するのは修正点が多く難しいので、
最初はstatic宣言は避ける用に意識してコードを書いてます。
本当に一つだけというのは数学/物理の定数以外だと少ないです。
以下はサンプルコードです。ご参考まで。
Java
1import java.util.ArrayList; 2import java.util.List; 3import java.util.concurrent.atomic.AtomicLong; 4 5public class A124581 { 6 7 public static void main(String[] args) { 8 // ※この店番号はぐぐって出てきた一ページ目の値なので適当です。 9 ATM atm = new ATM(230, 101); 10 System.out.println(atm); 11 // CIF番号を指定して検索 12 System.out.println(atm.query(0)); 13 } 14} 15 16class ATM { 17 private final int Tenban;// 店番 …店舗番号 18 private final int Kiban; // 機番 …端末番号 19 private final AtomicLong transaction_no = new AtomicLong(); // 取引通番 20 21 public ATM(int tenban, int kiban) { 22 this.Tenban = tenban; 23 this.Kiban = kiban; 24 } 25 26 public Record query(int cif_no) { 27 28 Record record = new Record(Tenban, Kiban, cif_no, transaction_no.incrementAndGet()); 29 // CIF番号を使って検索 30 31 // 検索結果を格納 32 record.add(1); 33 return record; 34 } 35 36 @Override 37 public String toString() { 38 return String.join("#", String.valueOf(Tenban), String.valueOf(Kiban)); 39 } 40} 41 42class Record { 43 private final int Tenban; 44 private final int Kiban; 45 private final int Cif_No; 46 private final long transaction_no; 47 private List<Integer> data = new ArrayList<>(); 48 49 public Record(int tenban, int kiban, int cif_no, long transaction_no) { 50 this.Tenban = tenban; 51 this.Kiban = kiban; 52 this.Cif_No = cif_no; 53 this.transaction_no = transaction_no; 54 } 55 56 public void add(int i) { 57 data.add(i); 58 } 59 60 @Override 61 public String toString() { 62 return String.join("#", String.valueOf(Tenban), String.valueOf(Kiban), String.valueOf(Cif_No)); 63 } 64}
投稿2018/05/03 10:02
総合スコア5846
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
メソッドをnewで宣言するというのはよくわかりませんが、オブジェクトを経由して呼び出すということだと考えます。そうなると、当該クラスはオブジェクトを作るものなのかどうか迷うもの(オブジェクトを作るとしても一つだけ)ということですよね?であれば、シングルトンと呼ばれるデザインパターンが適切です。以下、このパターンの代表例です。動作未確認
java
1class Sample 2{ 3 private static Sample myObject = null; 4 private Sample(){} 5 static getInstance() 6 { 7 if(null == myObject){ 8 myObject = new Sample(); 9 } 10 return myObject; 11 } 12 13}
このパターンは、ハードウェアリソースと直接紐づく場合など、オブジェクトの数を制限する際に便利です。最大の特徴はコンストラクタがprivateメソッドであることであり、外部からnewすることを認めません。インスタンス生成時は、必然的に内部のstaticメソッドを経由することとなるためです。
投稿2018/05/03 04:41
編集2018/05/03 04:47総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。