質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

1046閲覧

java クラス設計について<staticかnewか>

ikanosasimi

総合スコア32

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

2クリップ

投稿2018/05/03 04:19

ひとりプロジェクトでたとえばATMプログラムを作成していると仮定して、
ATMの入力画面や入金画面を作るさい、各メソッドをstaticで宣言しますか?それともnewで宣言しますか?
個人的には入力画面はクラス固有の機能なのでstaticを利用しますが、メモリのことを考えればnewのほうがいいと思います。
newとstaticどちらを利用するのが普通ですか?
newできるものはnewにしたほうがいいのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/05/03 04:38

ATM だったら Aさんの入力がBさんにみえたらだめなので `new ATM();` でしょうね
guest

回答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

umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

どれが普通科はよくわかりませんが、
staticで済むものは、staticにするようにしてますねー
イマドキのリッチな環境からしてみれば、それしきのメモリをケチってもしよーがないということで。

投稿2018/05/03 04:32

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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
HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問