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

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

ただいまの
回答率

90.75%

  • Java

    13145questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 427

1221_hima

score 12

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+6

同じ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/17 10:46

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

    キャンセル

  • 2017/11/17 10:49

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

    キャンセル

+6

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/17 10:46

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

    キャンセル

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/15 10:39

    > どのように他のクラスから参照すればよいのでしょうか

    二つの面があると思います。第一はJVMの仕様で、それはクラス名.classの場所で決まります。単一ソースに複数のpublicクラスを許すJVM言語でもJVMの仕様に従ったclassファイルを(ClassLoaderがロードできるような規則で)生成するようになっています。第二は言語自体の仕様で、ソース上でimportにより参照されているクラスのソースファイルを「クラス名から決定する」のか「クラス名とは関係なしにパッケージ名からそのクラスが含まれている可能性がある全てのソースから決定するか」の違いと言えると思います。Javaは多分前者を採用していてKotlinやScalaは後者を採用しているのだと思います(推測です)。

    どちらでも仕様として実現できますが、どちらかといえば「大規模なプログラムになればなるほど、一つのjavaファイルには一つのクラスのみあったほうがわかりやすくなる」というのが大規模開発でJavaの仕様が都合が良いルールと認識されているのではないでしょうか?

    キャンセル

  • 2017/11/15 10:50

    >「クラス名とは関係なしにパッケージ名からそのクラスが含まれている可能性がある全てのソースから決定するか」

    KotlinやScalaは触れたことがないのでいまいちわかりませんが、同様にJVMでコンパイルしているのだとすれば、、なるほど、そういった参照の仕方もあるのですね。。
    後学の参考にさせていただきます
    ありがとうございます!

    キャンセル

  • 2017/11/17 10:48

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

    キャンセル

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    javaのインスタンス化

    前提・実現したいことhttp://sasuke.main.jp/ranjava.html このページの Randomクラスの nextInt()メソッドを使用した例 を実行したい

  • 解決済

    メソッドでのエラー

    メソッドについてお伺いしたいです。 下記のプログラムを作りました。 コード import java.util.Scanner;  public class Med3 {

  • 受付中

    Javaのスーパークラスについて

    Javaのスーパークラスについての質問です。 課題でサンプル問題のコピーをして実際に動くことを確認するのですが java.lang.NoClassDefFoundError: 

  • 解決済

    java 初歩の初歩の入り口の質問 identifierエラー

    前提・実現したいこと これをエラーの出ない形に変えたい 発生している問題・エラーメッセージ エラー <identifier>がありません 該当のソースコード ja

  • 受付中

    シンボルが見つかりません

    Javaでオブジェクトを作成して使いたいのですが、シンボルが見つかりません。とエラーが出てしまいます。 まったくの無知ですみませんが、どこがおかしいか教えてください。

  • 解決済

    Java ソースファイルの命名規則について

    こんにちは。 現在、山本道子著の「JavaプログラマBronze SE 7/8」という学習書で勉強しています。 その中で疑問に思った問題があったので、質問させてください。 疑問

  • 解決済

    javaで指定したテキストファイルの文字を別のファイルに書き込む方法

    継承を使って指定したテキストファイルの文字を別のファイルに書き込むプログラムを作っています。継承の仕組みがあまり理解できておらず、困っています。 スーパークラスの機能:Jfin

  • 解決済

    コンパイルしたら複数のファイルが生成された

    前提・実現したいこと これはエラーというかこのままでも大丈夫なのかわからないのでそれを知りたいです 発生している問題・エラーメッセージ 「KeyType.class」「Stro

同じタグがついた質問を見る

  • Java

    13145questions

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

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