是否有任何 Java 方法排序约定? [关闭]

Posted

技术标签:

【中文标题】是否有任何 Java 方法排序约定? [关闭]【英文标题】:Are there any Java method ordering conventions? [closed] 【发布时间】:2011-06-07 18:45:20 【问题描述】:

我有一个大型类(大约 40 个方法),它是我将作为课程作业提交的包的一部分。目前,这些方法在公用/私有等方面非常混乱,我想以一种明智的方式对它们进行排序。有这样做的标准方法吗?例如。通常字段列在方法之前,构造函数列在其他方法之前,getter/setter 最后;剩下的方法呢?

【问题讨论】:

另请注意,当使用这样的代码时,大多数 IDE 允许您自动查看光标下方任何内容的定义。这意味着您只需扫一眼即可。 如果你在一个类中有 40 个方法 - 你做错了 【参考方案1】:

一些约定首先列出所有公共方法,然后列出所有私有方法 - 这意味着很容易将 API 与实现分开,即使不涉及接口,如果你明白我的意思的话。

另一个想法是将相关方法组合在一起 - 这样可以更容易地发现接缝,您可以将现有的大类拆分为几个更小、更有针对性的类。

【讨论】:

+1。我更喜欢按可见性排序。 Shame Eclipse 无法自动执行此操作(它总是将所有构造函数和所有方法组合在一起。) @finnw,提交错误报告。众所周知,奇怪的事情是从那里实现的。 @Ben:我的经验是,任何“从不”都会有例外。 @JonSkeet 在少数情况下,排序约定不再相关,例如测试类。不写糟糕的代码比如何安排糟糕的代码更好。 @Ben:我认为我们必须同意不同意。我编写的代码自然有很多成员,没有违反任何关注点分离等。【参考方案2】:

    类(静态)变量:首先是公共类变量,然后是 受保护,然后是私有。

    实例变量:首先是公共的,然后是受保护的,然后是私有的。

    构造函数

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

来源:http://www.oracle.com/technetwork/java/codeconventions-141855.html

【讨论】:

这是 15 年的历史,可能与现代 IDE 的外观有点过时...... @assylias:IMO,可读性独立于 IDE。在私有之前保持公开通常更好。 这是 9(2021-2012) 年的历史,现在可能是黄金。 当我们有静态变量、静态块、静态方法、构造函数、实例变量和实例方法时,排序约定是什么?【参考方案3】:

《代码约定》的更精确链接:«Class and Interface Declarations»

【讨论】:

+1,afaik - 这是唯一真正回答问题的帖子。是的,Oracle 和 Sun 规定了一个标准顺序:1. 公共评论,2. 类,3. 内部评论,4. 静态数据,5. 实例数据,6. ctors,7. 方法,以及在每个部分组内从逻辑上讲,而不是通过可访问性。 @VadimKirilchuk «Internet Archive» 已关闭…… oracle.com/technetwork/java/codeconvtoc-136057.html【参考方案4】:

不确定是否有普遍接受的标准,但我自己的偏好是;

构造函数优先 静态方法其次,如果有主方法,总是在其他静态方法之前 接下来是非静态方法,通常按照方法的重要性顺序,然后是它调用的任何方法。这意味着调用其他类方法的公共方法出现在顶部,而不调用其他方法的私有方法通常最终出现在底部 toStringequalshashcode 等标准方法 getter 和 setter 在类的底部保留了一个特殊的位置

【讨论】:

我真的更喜欢构造函数最后,因为正确编写的构造函数除了将其参数分配给属性之外应该做的很少。 @GordonM 你为什么这么认为?我什至认为相反的情况是正确的。您应该始终为您的类考虑最干净的 API。而这往往不是它们的存储方式,所以我经常做相当多的处理来减轻调用者的负担 @GordonM 我不是在谈论副作用。因此,不会对已通过的列表或类似内容进行任何更改。只是传递和设置值需要类告诉你很多关于它的实现,情况不应该是这样 @LonelyNeuron 我不太清楚你在说什么,但看起来你说构造函数除了将其参数分配给内部状态之外应该做很多设置工作。这绝对是错误的,因为这意味着事情正在通过“魔术”发生。对new Thing() 的调用只会导致实例化一个新事物。它不应导致打开数据库连接、写入文件等。 @LonelyNeuron 在构造函数中有依赖项并不会告诉你关于类的实现的任何信息,除了它的依赖项是什么。这是一件好事,不是一件坏事。【参考方案5】:

一个类40个方法有点多。

将一些功能移动到其他适当命名的类中是否有意义。这样就更容易理解了。

当你的阅读量较少时,以自然的阅读顺序列出它们会容易得多。一个常见的范例是按照您需要的顺序列出您需要的东西之前之后

这通常意味着main() 在顶部或底部。

【讨论】:

你说得对——这不是订购问题 你并不总是有选择的余地,例如,如果你正在实现一个包含很多方法的接口。 这是一个 android Activity,所以有很多其他地方根本无法使用,onPause()onResume() 等,以及我所有的 OnClickListener 字段,其中,尽管它们是字段,但它们的外观或行为与它们不同,因此将它们分开列出是明智的。 @finnw,抽象类很好,也可以用于此目的。【参考方案6】:

我的“约定”:在实例之前是静态的,在私有之前是公共的,在方法之前是构造函数,但主要方法在底部(如果存在)。

【讨论】:

【参考方案7】:

此外,如果您出于某种原因混淆了班级成员,Eclipse 还提供了为您排序班级成员的可能性:

打开你的类文件,在主菜单中选择“Source”并选择“Sort Members”。

取自这里:Sorting methods in Eclipse

【讨论】:

【参考方案8】:

您在使用 Eclipse 吗?如果是这样,我会坚持使用默认的成员排序顺序,因为阅读您的代码的人可能最熟悉它(尽管它不是我最喜欢的排序顺序。)

【讨论】:

以上是关于是否有任何 Java 方法排序约定? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

REST API 是不是有任何命名约定准则? [关闭]

数据库、表和列的命名约定? [关闭]

在java中放置内部类的约定是啥? [关闭]

Oracle PL/SQL 代码约定 [关闭]

java中的类名约定[关闭]

SQL Server 索引命名约定 [关闭]