2012-02-21 8 views
-1

タイトルがすでに述べたように、EclipseでJavaでクラスに別のファイル名を与えることがどうにか可能かどうかを知りたいですか?EclipseでJavaでクラスに別のファイル名を与えることはどういうことですか?

編集:Eclipseで可能かどうかを知りたいだけです。あなたが答えを知らないなら、納得のいく答えで反応する衝動に抵抗してください。

Edit2:私はここでどのような反応を返すの陽気です。私が知りたかったのは、ファイル名の異なるクラス(と私はパブリッククラスを意味する)を持つことが可能で、それ以外は何もできないということです。私はこれがこれらの質問をするフォーラムのようなものだと思っていましたが、私が得た2番目の対応はすでに侮辱でした。これはある種のタブー問題か、何が起こっているのでしょうか?

+3

「クラスB.java」ファイルで「クラスA」が宣言されているようなものですか?インナークラスなどとは別に、もしあなたがそれを行うことができるかどうかは、私が確信していません。 – Marcelo

+0

* "タイトルが既に.."と書かれているように*タイトルや本文には何も書かれていません。なぜこのようなばかげたことをしたいのですか?(マルセルは正確にそれを説明していました。 –

+0

その理由は何ですか? –

答えて

3

私はなぜそれをしたいのかわかりませんが、シンボリックリンクの助けを借りてコマンドラインからファイルをコンパイルすると可能です。

class YourClassがファイルOtherName.javaに保存されているとします。: - :

UNIXシステム:(他のシステムが検証されていないことを確認Solaris上で動作しないために)

ln -s OtherName.java YourClass.java 
javac YourClass.java 

WINDOWSシステムあなたは、このような、そのファイルへのシンボリックリンクを作成した場合コンパイラが型を見つけ、コンパイルが働く

mklink YourClass.java OtherName.java 
javac YourClass.java 

を...(Windows Vistaの/ 2008 +上で動作します)


このソリューションは、Unixシステム上で検証していますが、Windows Vistaの/ 2008 +の上に確実に動作しますされていません。..

以下
+0

これは非常に興味深いです。ありがとうございました。 – HardCoder

+0

@Primosk on solarisコンパイルが正常に動作し、実行時エラースレッドmain "例外"の例外java.lang.NoClassDefFoundError:Test1 –

+0

@Balaswamyvaddeman、もしわかっていれば、 'class Test1'を作成してTest.javaに保存しました。次に、Test.javaへのシンボリックリンクTest1.javaを作成し、 'javac Test1.java 'を実行しようとしましたが失敗しましたか?それがそうなら、私は答えを修正します.... – PrimosK

7

あなたのファイル名は、あなたのクラス名、ストーリーの終わりと常に一致する必要があります。 JLSは、実行する必要があることを明確に述べていませんが、その決定を下すためにコンパイラの実装に任せています。私は確かにほとんど(もし全部ではないが)あなたがその標準と異なることを許さないと確信しています。

The JLS states:

When packages are stored in a file system (§7.2.1), the host system may choose to enforce the restriction that it is a compile-time error if a type is not found in a file under a name composed of the type name plus an extension (such as .java or .jav) if either of the following is true:

  • The type is referred to by code in other compilation units of the package in which the type is declared.
  • The type is declared public (and therefore is potentially accessible from code in other packages).

This restriction implies that there must be at most one such type per compilation unit. This restriction makes it easy for a compiler for the Java programming language or an implementation of the Java virtual machine to find a named class within a package; for example, the source code for a public type wet.sprocket.Toad would be found in a file Toad.java in the directory wet/sprocket, and the corresponding object code would be found in the file Toad.class in the same directory.

だから、Eclipseでファイル自体、またはファイルシステムの名前を変更することができるかもしれない - あなたは以上の可能性が高いコンパイルエラーがヒットします。

+0

+1、これまでのところ最高の答え。 –

+0

しかし、Eclipseのコンパイラを使用してファイル名のチェックを外すと、クラスはコンパイルされて正常に動作します。あれは正しいですか? – Marcelo

+0

私はそれが解釈に開かれているかもしれないと思う。私はちょうどJavaの仕様を読んで、それは "タイプ"を参照し、 "1つのタイプ"またはそれ以外のものは参照しません:http://java.sun.com/docs/books/jls/third_edition/html/packages。 html#7.6 "7.6トップレベル型宣言 - デフォルトでは、パッケージ内で宣言されているトップレベル型は、そのパッケージのコンパイル単位内でしかアクセスできませんが、型はpublic型として宣言され、他のパッケージ(§6.6、§8.1.1、§9.1.1)。 "私はまた、ファイル名に関してそれほど多くを見なかったが、私はそれを見逃したかもしれない。 – HardCoder

1

Javaには、Javaプログラミング言語の命名規則または規則とは何がありますか? Eclipseは単なるIDEであり、Javaを使用している場合はのルールに従わなければなりません。

あなたはX.javaファイルを持っているとします。つまり、このファイルにはpublic/abstract/final class named Xを1つだけ含めることができます。クラスとその名前の数と入れ子関係には制限がありませんは、そのクラス名としてファイル名を保持しているクラスが1つしかない限りです。クラスがファイル名を取る場合、これらの修飾子は1つ以上必要です:public, static, final.それは物語です。

+0

もう1つのポスターは、明確なJavaルールを載せていないので、あなたはその点(または彼のこと)とその単なるEclipseのことに間違っていると投稿しました。 Eclipseでその動作を変更する可能性がある場合は、私が知りたいと思っていたものです。 – HardCoder

+0

私はこの問題に間違いはない、あなたのコードでいくつかのネーミングクラスを試して、結果を見てください。 – Juvanis

+0

いいえ、あなたがそのJavaルールを言ったということです。彼はコンパイラのことを言います。それはどちらですか? – HardCoder

1

いいえ、Javaのパブリッククラスとファイルの名前は同じである必要があります。

あなたがクラスに別の名前を付けるしようとした場合、コンパイラは

class YourClass is public, should be declared in a file named YourClass.java 

で失敗します。しかし、あなたはpublicクラスが含まれているファイルには、追加のプライベートクラスを宣言することができます。

1

を使用すると、別のクラス名を持つことができるような状況です。

1.classは、パブリッククラスではなく、少なくとも1つのパブリッククラスが2.ClassがInnerClassある

class notpublic{ 

} 
public class PublicClass { 

} 

に定義されたJavaファイルに存在します。

public class PublicClass { 

     class InnerClass{ 

     } 
    } 
関連する問題