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

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

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

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

Q&A

解決済

3回答

8456閲覧

Javaで1つのファイルの中にpublic classを複数作るのは言語の特徴として良くないことなのか

hi_se_pr

総合スコア21

Java

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

0グッド

0クリップ

投稿2017/11/14 15:53

タイトルでほぼ完結してしまっているのですが、Javaでプログラミングをしていて2つのクラスにpublic修飾子をつけるとIDE上で新しく〇〇.javaというファイルを作りなさい、というような内容をあらわす注意が出てきます。

他のファイルからそのクラスにアクセスしやすくするためにpublicをつけるならファイルごとにしなさい、ということでしょうか?

なんとなくそいうものかな、と思ったのですがちゃんとした解が欲しいと思ったので質問させていただきました。

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

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

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

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

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

guest

回答3

0

Javaという言語の仕様を理解するときに、

  1. 企業が言語を開発していて(旧Sun、現Oracleが開発元)
  2. 企業が言語を利用している(SIerの大定番)
  3. 大規模開発向けの言語(エンタープライズなど)

という特徴を押さえるだけで、かなり分かりやすくなります。
一言で言うと、スーツ寄りのネクタイを締める言語です。
(個人的にはノーネクタイのLLの方が好みですが)

規格を統一するのは大規模になるほど強力です。
たとえ冗長でも、属人性を低めて、人間の可読性を高めるのがひとつ。

10行単位で考えると、「ファイル分けるの面倒」とかあるでしょうが、
10万行が9万行になっても11万行になっても、全体では大差ないんです。
それよりなるべく、10万行から10行を探さない方が効率が良いんです。

100回に1回くらいは1ファイルに2クラス入ってる」みたいな例外があると、
人間は盲点に気付きにくいので、100倍の時間が掛かったりするんです。

もうひとつは、機械にとっても読みやすくなります。
Javaは静的言語なので、コンパイルが必要です。

静的型付けが早いという理屈の応用で、コンパイラ側から見ると、
(publicの)1クラス1ファイルみたいな、制約が多いほどコンパイルが早い

ここで、大規模開発だとソース量が多いので、コンパイルに時間が掛かります。
約20年前(95年)からありますが、一般的に昔はコンパイルの時間が遅かったんです。
大規模だと1回何時間掛かるとかあったようです。「コーヒータイム」と言ったり。
だから、1クラス1ファイルも、少しでも早くする工夫のひとつなんでしょう。

逆にRubyとかLLがどうして遅いかというと、実行時に調べることが多いからです。
そのかわり、読み書きしやすくなり、小規模だと快適で個人的には好みですが。

投稿2017/11/14 20:17

LLman

総合スコア5592

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

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

hi_se_pr

2017/11/17 01:46

回答ありがとうございます。 コンパイルの速さのことまで頭が回りませんでした。。。 規模によって言語を使い分けるのも1つの手なんですね
guest

0

ベストアンサー

同じJVM言語でもKotlinやScalaなどはpublicのクラスを一つのファイルへ置けますので、これは単にJavaの言語仕様で「そう決められているから」としか自分には言えません。

Java設計者はなぜそういうポリシーにしたのでしょうね。

https://stackoverflow.com/questions/3578490/why-only-1-public-class-in-java-file

これなどを見ると「publicクラスをそれぞれ独立したソースファイルとすること=優れたデザインプラクティス」とJava設計者が考え、それを単なる習慣ではなく言語仕様として強制するほど重要と考えたのかなぁというふうに思いました。前述したKotlinやScalaはそれに反対の立場を採っているので「Javaの選択が優れいる」とも「優れていない」とも自分には言えませんが、少なくともJavaの後発の言語がそれを採用していないということは誰もが認めるデザインプラクティスではなかったのかも知れません。

投稿2017/11/14 17:29

KSwordOfHaste

総合スコア18394

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

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

hi_se_pr

2017/11/17 01:46

回答ありがとうございます。 他言語との比較があって理解の手助けになりました。 各言語様々な設計に基づいて作られているのですね。
KSwordOfHaste

2017/11/17 01:49

>書く言語様々な と、思います。ただ、大規模開発前提で言えばLLmanさんやdousuruyoさん回答にあるようにpublic classとソースが1:1になっている点に価値を認める意見があるのは個人的にも非常に納得がいきます。
guest

0

実際大規模なプログラムになればなるほど、一つのjavaファイルには一つのクラスのみあったほうがわかりやすくなると思います。
そもそも〇〇.javaというファイルの中に、public class △△というクラスがあったときに、どのように他のクラスから参照すればよいのでしょうか。。
それにそのケースだと△△.javaというファイル名でも許しちゃうのでしょうか?(ファイル名はpublicクラス名と同じである制約があるため

また、確か同じ〇〇.javaファイルの中にpublic class 〇〇、public class △△を作った場合、メインメソッドはpublicクラスの中に記述することというルールがありますが、どちらのクラスのメインメソッドから実行すればいいかわからなくなるのでエラーになる、と聞いたことがあるような気がします。

何分あいまいな記憶ですので、嘘言っていたらすいません。。

投稿2017/11/15 01:19

dousuruyo

総合スコア74

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

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

KSwordOfHaste

2017/11/15 01:39

> どのように他のクラスから参照すればよいのでしょうか 二つの面があると思います。第一はJVMの仕様で、それはクラス名.classの場所で決まります。単一ソースに複数のpublicクラスを許すJVM言語でもJVMの仕様に従ったclassファイルを(ClassLoaderがロードできるような規則で)生成するようになっています。第二は言語自体の仕様で、ソース上でimportにより参照されているクラスのソースファイルを「クラス名から決定する」のか「クラス名とは関係なしにパッケージ名からそのクラスが含まれている可能性がある全てのソースから決定するか」の違いと言えると思います。Javaは多分前者を採用していてKotlinやScalaは後者を採用しているのだと思います(推測です)。 どちらでも仕様として実現できますが、どちらかといえば「大規模なプログラムになればなるほど、一つのjavaファイルには一つのクラスのみあったほうがわかりやすくなる」というのが大規模開発でJavaの仕様が都合が良いルールと認識されているのではないでしょうか?
dousuruyo

2017/11/15 01:50

>「クラス名とは関係なしにパッケージ名からそのクラスが含まれている可能性がある全てのソースから決定するか」 KotlinやScalaは触れたことがないのでいまいちわかりませんが、同様にJVMでコンパイルしているのだとすれば、、なるほど、そういった参照の仕方もあるのですね。。 後学の参考にさせていただきます ありがとうございます!
hi_se_pr

2017/11/17 01:48

回答ありがとうございます。 まだまだJavaを触り始めたばかりで制約をまだ把握しきれてませんでした・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問