Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 禁止强制执行;公共类型xyz必须在其自己的文件“中定义”;_Java_Eclipse - Fatal编程技术网

Java 禁止强制执行;公共类型xyz必须在其自己的文件“中定义”;

Java 禁止强制执行;公共类型xyz必须在其自己的文件“中定义”;,java,eclipse,Java,Eclipse,noobjava问题 对于我的项目,我在XML文件中定义了一个类模型,然后将其转换为一个模型。例如: <model> <class name="abc"><field>one</field><field>two</field></class> <class name="xyz"><field>f1</field><field>f2/field>

noobjava问题

对于我的项目,我在XML文件中定义了一个类模型,然后将其转换为一个模型。例如:

<model>
    <class name="abc"><field>one</field><field>two</field></class>
    <class name="xyz"><field>f1</field><field>f2/field></class>
</model>
显然,将每个类转换为自己的.java文件是一件麻烦事。将它们堆积在一个.java文件中会更容易管理。但是,java有这样的要求,即每个类必须在自己的文件中定义,并且文件名必须与类名匹配。否则,编译器将显示错误:
必须在自己的文件中定义公共类型XYZ

可以这样定义它:

public class ModelContainer {

    public class abc {
        ...
    }
    public class xyz {
        ...
    }
}

还有别的办法吗?理想情况下,我正在寻找一个编译器开关或类似的东西,它将禁用在自己的文件中包含每个类的要求。我正在使用Eclipse,如果这有什么不同

如果您同意使用内部类,那么是的,这将起作用,但每次您要实例化内部类时,都必须获得外部类的实例:

public class ModelContainer {
    public class abc {
        ...
    }
    public class xyz {
        ...
    }
}
您还可以将嵌套类声明为静态类,因此无需首先实例化外部类:

public class ModelContainer {
    public static class abc {
        ...
    }
    public static class xyz {
        ...
    }
}

有关其他详细信息,请查看此选项。

您需要的编译器开关不存在。确保每个类都位于一个正确命名的文件中——并且位于目录层次结构中的正确位置(假设您将类组织在包中)——始终由Java编译器强制执行。大多数Java开发人员都不会梦想关闭它,因为这种组织源代码的方式被认为是良好的实践。(因此,Java开发人员在试图使用C#等不强制执行此限制的语言浏览大型、不规则的项目时,会有一些小噩梦。)

唯一不需要遵守此约束的类是匿名类或内部类,但您的应用程序不应该主要由这些类组成。

有趣的是:

如果且仅当包存储在文件系统(§7.2)中时,如果在由类型名加扩展名(如
.java
.jav
)组成的文件中找不到类型,则主机系统可以选择强制执行编译时错误的限制,前提是以下任一情况为真:

  • 该类型由声明该类型的包的其他编译单元中的代码引用
  • 该类型被声明为
    public
    (因此可以从其他包中的代码访问)
这就是说,由于编译器可以强制执行这样的要求,所有可移植代码都应该符合实践


关于您的特定情况,您应该考虑每个文件规则的一个顶级类是语言需求。通常的方法实际上是为每个类生成一个单独的

.java
文件(使用嵌套类,甚至是静态类,有许多令人讨厌的方面),但是如果你有更好的理由不关闭和打开文件,你可以使用嵌套类来解决这个问题。

,但稍微复杂一点的方法是完全跳过创建Java源代码。您可以使用字节码库(如Javassist或ASM)直接创建类文件。本质上,您将把XML声明编译成可执行代码

如果您正在创建如图所示的简单值对象,这将非常容易

生成大量文件似乎有问题,因此可以将类文件直接写入JAR文件(使用ZIP I/O类),并将合成类作为单个库文件生成


(您可能希望将这些类标记为合成类,尽管XML声明可以被视为源代码,这意味着它们在技术上不是合成的。)

来自.NET背景,我的假设是,如果您将类声明为静态类,您将无法创建它的实例。这不是它在Java中的工作方式,是吗?@galets在Java中的工作方式不同,请看这一点,但长话短说:是的,您可以在Java中实例化静态嵌套类。@galets是的,
static
在Java中意味着完全不同的东西(就像
final
),因此,在阅读Java规则之前,不要假设修饰符会转移。生成的类必须是公共的吗?通常,我不会破坏平台的正常编码实践。但正如你在这个例子中清楚地看到的,这是有意义的,这确实很有趣。正如我所怀疑的,除了一项公约之外,没有其他理由不允许这样做。这让我觉得应该有某种开关来禁用该检查。@galets整个语言都是“约定的”。习俗是有用的,也是重要的,不应该因为一些次要的原因而被忽视。别误会我的意思,你似乎是一个语言纯粹主义者,对你来说更强大,我不是来这里亵渎任何东西的。但就我个人而言,我写软件是为了生活,所以对我来说,语言是一种工具。工具的存在是为了让我的生活更轻松,而不是以另一种方式,所以我毫无保留地反对以适合我的方式来弯曲它needs@galets我不是一个“纯粹主义者”,但将类放在它们自己的文件中比以大写字母开头的类名更基本。如果有一个很好的理由把它们都放在一起,那么当然,但是,你的API会让任何试图使用它的人感到困惑。。。你找到我被培养成不够好的原因了吗?
public class ModelContainer {
    public static class abc {
        ...
    }
    public static class xyz {
        ...
    }
}