Java 禁止强制执行;公共类型xyz必须在其自己的文件“中定义”;
noobjava问题 对于我的项目,我在XML文件中定义了一个类模型,然后将其转换为一个模型。例如: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>
<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 {
...
}
}