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

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

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

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

設計相談

システムの設計についての相談や質問を投稿する際にご使用ください。

Q&A

2回答

391閲覧

JavaのMainクラスに持たせる役割や処理とは

perfectibility

総合スコア46

Java

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

設計相談

システムの設計についての相談や質問を投稿する際にご使用ください。

0グッド

0クリップ

投稿2023/10/21 15:44

聞きたい事

main(String[] args)を持つクラスをどう扱うのか。
また、どのクラスが持つべきなのか。

前提及び現状

Javaで自習のアウトプット兼、英語勉強用に英単語出題ソフトを作っています。
一度完成はしたのですがプログラミングの練習としてより洗練・改善できるように何度も作り直しています。
初めて作った時から思っていたのですが、Mainクラス(正確に言うとmain(String[] args)を持つクラス)はどのように扱うべきなのでしょうか?
現状は以下の通りGUIクラス(GUI全体を管理するようのクラス)にMyFileIOクラスを用いて英単語を読み取る等の処理を預けているのですが、これならばGUIクラスにmain(String[] args)メソッドを入れればいいのですが、GUIクラスが全体を管理するべきなのか?と思っています。
ただこのソフトではGUI以外に主に処理がないのでこのソフトに限ればGUIクラスに入れるのが最適なのでしょうか?
また単語を読み取るのを別スレッドにする場合GUIクラス内で生成するべきか、Mainクラスで両方の管理をすべきなのか。

現状の「main(String[] args)」の場所(★の付いているクラス)

MyDictionaly ┗ GUI ━ GUIクラス ┃   ┗ FirstPanelクラス ┃   ┗ ProblemPanelクラス ┃   ┗ : ┃   ┗ : ┃ ┗ Systems ━ Wordクラス ┃     ┗ MyFileIOクラス ┃     ┗ : ┃     ┗ : ┃ ┗ Mainクラス ★

Mainクラスのソースコード

Java

1import GUI.GUI; 2 3public class Main { 4 public static void main(String[] args){ 5 GUI g = new GUI(); 6 g.show(); 7 } 8}

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

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

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

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

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

guest

回答2

0

回答ではなく補足です。

JavaのmainメソッドにはGUIかどうかに関係なくメインスレッドとしての役割があるので、普通はmainの終了でアプリケーションが終わります。しかし、AWTやSwingなどのGUIフレームではFrameWindowなどを作成したタイミングで自動的にスレッドが起動し、そのスレッドが終了するまでmain関数が終了してもアプリケーションが終わりません。JavaFXはmainメソッドからApplication派生クラスのインスタンスをlaunch()して起動する場合、mainが終了してアプリケーションが終わります。

なので前者の場合は、mainメソッドをどのクラスに置くかはあまり気にしなくていいと思います。後者の場合は変なクラスに置くと、インスタンスの生存期間的に不思議な感じになりそうです。

最後に、mainメソッドの終了とスレッドの生存期間についてのサンプルコードを提示します。

Java

1class ProcessWithThread { 2 public static void main(String[] args) { 3 var thread = new Thread(() -> { 4 try { 5 for (int i=0; i < 10; i++){ 6 Thread.sleep(1000); 7 System.out.println("thread running..."); 8 } 9 } 10 catch(Exception e) { 11 e.printStackTrace(); 12 } 13 }); 14 thread.setDaemon(args.length > 0); 15 thread.start(); 16 System.out.println("main finished..."); 17 } 18}

引数が1つもない場合、mainが抜けてもスレッドが動き続けていることが確認できます。
ただし引数を1つでも加えるとスレッドがデーモンとして起動するので、実行したスレッドの終了を待たずにプロセスが終了します。

投稿2023/10/22 01:26

dameo

総合スコア943

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

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

perfectibility

2023/11/02 23:17

FXの方はまだ触っていなかったので今後使うとき注意点気をつけます! またmainスレッドとswingスレッドの関係についてなど知らない事ばかりだったので大変参考になる事たくさんありがとうございます! まったく知らなかった事だったので自分でも調べてみようと思います!
guest

0

Oracle からの公式なアナウンスは無かったと思いますので、どうでもいいと思います。

個人的には、質問の Main クラスのように何の中身も無いモノははぼ無駄と考えます。

投稿2023/10/21 15:59

jimbe

総合スコア12744

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

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

perfectibility

2023/11/02 23:18

公式で出ていなかったのですね 調べても出ないわけだ… 今回のコードでは確かにまったく意味の無いものなのでもう少し改良します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問