Java 是否存在关于类结构的约定?

Java 是否存在关于类结构的约定?,java,conventions,Java,Conventions,当我用Java编写一个类时,它(几乎)总是这样: public class MyClass { // attributes // constructors // methods: // * "interesting" methods // * getters and setters // * toString / equals / hashCode } 特别是,我总是在开始时编写所有属性 在Java中如何构造类有约定吗 我在房间

当我用Java编写一个类时,它(几乎)总是这样:

public class MyClass {

    // attributes

    // constructors

    // methods:
    //   * "interesting" methods
    //   * getters and setters
    //   * toString / equals / hashCode
}
特别是,我总是在开始时编写所有属性

在Java中如何构造类有约定吗

我在房间里找不到它。我对资料来源感兴趣(例如其他风格指南,如书籍),因为我是一名Java导师,我想给我的学生更多的东西,而不仅仅是“我是这样学的,所以你也应该这样做”。如果有理由/来源建议在一个类中使用其他结构,我也很乐意知道这一点


编辑:虽然我对你的想法很感兴趣,但我想我应该强调,我希望得到来源。个人经历很有趣,但我也有这样的经历,上面的结构很常见。但我想给我的学生们的不仅仅是模糊的印象,每个人似乎都在使用这种结构。特别是,因为他们中的一些人不使用它。

没有唯一的
惯例来组织你的课堂资源。您列出的结构非常常见-首先是属性,然后是构造函数,然后是方法。然而,有些团队喜欢将属性保留在类的尾部,有些团队将字段定义与其setter和getter混合在一起。团队应该在内部就一些约定达成一致,以保持其所有来源看起来相似

我不能支持这一点,但我认为在类的beging中声明成员变量并后跟构造函数是适用于所有语言的唯一“约定”。我使用引号是因为它是自然的,好像它是把它们放在对象定义中唯一的逻辑方法(不像其他东西,例如C++样式括号等)

你应该更仔细地阅读:Oracle编码约定,你链接到3.1.3:

下表按照类或接口声明的顺序描述了它们的各个部分 应该出现。请参阅第19页的“Java源文件示例”,以获取包括 评论

  • 类/接口文档注释
    (/***…*/)

    有关详细信息,请参见第9页的“文档注释” 关于此评论中应包含的内容的信息

  • 类或接口语句

  • 类/接口实现注释
    (/*…*/)
    ,如有必要

    此注释应包含任何不适用于类/接口文档注释的类范围或接口范围的信息

  • 类(静态)变量

    首先是公共类变量,然后是受保护的,然后是私有的

  • 实例变量

    首先是公共的,然后是受保护的,然后是私人的

  • 构造函数

  • 方法

    这些方法应该按功能分组,而不是按范围或可访问性分组。例如,私有类方法可以位于两个公共实例方法之间。目标是使阅读和理解代码更容易


  • 这就是说,这项公约已经过时,而且通常不遵循细则。例如,按可访问性排序字段而按功能排序方法似乎很奇怪。事实上,我很少在专业代码中看到按可访问性排序的字段。但是,在专业代码中,要点的顺序是非常普遍的。

    与每种语言一样,除了语言规范(如果存在)和团队或项目的本地约定之外,没有其他权威来源。Java语言规范没有对成员进行特定的排序。

    您可以使用Checkstyle之类的工具(http://checkstyle.sourceforge.net/).

    它包含一些类结构检查(例如修饰符顺序、命名约定等)


    这不是展示编码约定的最好方式。但实际的优势是,Checkstyle可以直接用于IDE或自动构建中,这样您的学生就可以看到它们直接应用到代码中。

    上面显示的结构非常常见。但是一如既往,编码惯例是由开发团队或您所在的公司决定的。为什么会被否决?Oracle的约定并不比任何其他约定更具权威性,只有Java语言规范才具有权威性,团队/项目本地约定是唯一应该遵循的约定。我还想在您否决Meno my downvote时发表您的评论,但:有约定。你可能不同意他们,他们甚至可能彼此都不同意,但他们是存在的,OP要求他们(“我期望消息来源”)。好吧,当我说没有约定时,我的意思是没有唯一的约定。我已经修正了我的答案。我认为Oracle编码惯例是广泛传播的编码转换的良好来源。我不认为语言规范与编码转换有任何关系,所有编码转换都必须在语言规范允许的范围内运行。语言规范说明什么是有效代码,转换说明什么是好代码。被广泛传播,顺便说一句,惯例并不能使它们广泛传播,因为大多数项目不会仅仅因为你违反了它们就拒绝你的贡献。我认识到它们是很好的编码实践,但我不明白那些没有被强加的东西是如何被称为该项目的编码约定的。。。