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

时间:2013-11-01 16:39:28

标签: java eclipse

Noob java问题。

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

<model>
    <class name="abc"><field>one</field><field>two</field></class>
    <class name="xyz"><field>f1</field><field>f2/field></class>
</model>

并将其转化为:

public class abc {
    String _one;
    String _two;
    public String get_one() {
        return _one;
    }
... and so on you get an idea

显然,将每个类转换为自己的.java文件会很麻烦。将它们堆积在一个.java文件中会更容易管理。但是,java有这样的要求,即必须在自己的文件中定义每个类,并且文件名必须与类名匹配。否则,编译器将显示错误:The public type XYZ must be defined in its own file

可能会这样定义:

public class ModelContainer {

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

还有其他方法吗?理想情况下,我正在寻找一个编译器开关或类似的东西,这将禁止要求将每个类放在自己的文件中。我正在使用Eclipse,如果这有任何区别

4 个答案:

答案 0 :(得分:1)

如果你可以使用内部类,那么是的,这将有效,但每次你想要实例化一个内部类时你都必须获得外部类的实例:

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

此外,您可以将嵌套类声明为static,因此不必首先实例化外部类:

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

请查看此post了解更多详情。

答案 1 :(得分:1)

有趣的是,it's not actually a language requirement to have each top-level class in its own .java file

  

当且仅当包存储在文件系统(第7.2节)中时,如果在由组成的名称下的文件中找不到类型,则主机系统可以选择强制执行编译时错误的限制。如果满足以下任一条件,则类型名称加上扩展名(例如.java.jav):

     
      
  • 该类型由声明类型的包的其他编译单元中的代码引用。
  •   
  • 类型声明为public(因此可以从其他包中的代码访问)。
  •   

也就是说,由于编译器可能会强制执行此类要求,因此所有可移植代码都应符合惯例。

关于您的具体情况,您应该将每个文件的顶级类规则视为语言要求。通常的方法是为每个类生成一个单独的.java文件(使用嵌套类有许多恼人的方面,甚至是静态类),但是你可以通过使用嵌套类来解决这个问题,如果你有比不关闭和打开文件更好的理由。

答案 2 :(得分:1)

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

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

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

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

答案 3 :(得分:0)

您想要的编译器开关不存在。确保每个类都在一个正确命名的文件中 - 并且在目录层次结构中的正确位置(假设您在包中组织类) - 始终由Java编译器强制执行。大多数Java开发人员都不会想要关闭它,因为这种组织一个源代码的方式被认为是一种很好的做法。 (因此,Java开发人员在尝试使用C#等不执行此限制的语言中导航大型不守规矩的项目时会有轻微的噩梦。)

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