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


159

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


还要注意的是,当工作与这样的代码,大多数IDE的让你看到的定义,无论是自动光标下方。这意味着您无需看一眼。
托尔比约恩Ravn的安德森

如果你在一个类40种方法-你做错了它

Answers:


132

有些约定首先列出了所有公共方法,然后列出了所有私有方法-这意味着即使您不了解接口,也很容易将API与实现分开,即使没有涉及接口,也是如此。

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


1
+1。我更喜欢按可见性排序。Shame Eclipse无法自动执行此操作(它将始终将所有构造函数和所有方法分组在一起。)
finnw 2011年

16
@finnw,提交错误报告。已知从那里可以实施陌生事物。
托尔比约恩Ravn的安德森

3
@本:我的经验是,任何“从不”都会有例外。
乔恩·斯基特

1
在某些情况下,@ JonSkeet不再使用排序约定,例如,测试类。与如何安排不良代码相比,不建议撰写不良代码更好。

1
@本:我认为我们必须同意不同意。我已经写了,那里有很自然的许多成员的代码,在不违反关注等任何分离
乔恩斯基特

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

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

  3. 建设者

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

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


4
这是15岁,可能与现代IDE的外观有些过时了……
assylias 2014年

16
@assylias:IMO,可读性独立于IDE。在私有之前公开公开通常会更好。
saurabheights

40

与《代码约定》的更精确链接:《类和接口声明》


8
+ 1,afaik-这是实际上回答问题的唯一帖子。是的,按照Oracle和Sun的规定,有一个标准顺序:1.公共评论,2。类,3。内部评论,4。静态数据,5。实例数据,6。ctor,7。方法以及每个部分组中从逻辑上讲,不是通过可访问性。
约翰·亨克尔

@VadimKirilchuk«互联网档案»倒塌了
Timofey Gorshkov


15

不知道是否有公认的标准,但我个人的喜好是:

  • 构造函数优先
  • 接下来是静态方法,如果有主要方法,则总是在其他静态方法之前
  • 接下来是非静态方法,通常按方法的重要性顺序执行,然后依次调用该方法。这意味着调用其他类方法的公共方法出现在顶部,而不调用其他方法的私有方法通常出现在底部
  • 标准方法一样toStringequalshashcode未来
  • getter和setter在班级底部保留一个特殊的位置

我确实更喜欢最后一个构造函数,因为正确编写的构造函数除了将其参数分配给属性外,应该做的很少。
GordonM'5

@GordonM您为什么这么认为?我什至认为相反的说法是正确的。您应该始终为您的类考虑最干净的API。而且这通常不是它们存储的方式,因此我经常进行大量处理以减轻呼叫者的负担
Neuron

@GordonM我不是在谈论副作用。因此,无需更改已通过列表或类似的列表。只是路过和设定值要求类会告诉你很多关于它的实现,它不应该是这样的
神经元

@LonelyNeuron我不太确定您在这里说的是什么,但是您似乎在说构造函数除了将其参数分配给内部状态外,还应该做很多设置工作。这绝对是错误的,因为这意味着事情是通过“魔术”发生的。调用new Thing()只会导致实例化一个新的事物。它不应该导致数据库连接被打开,被写入文件,等等等等
GordonM

@LonelyNeuron在构造函数中具有依赖项不会告诉您有关类的实现的任何信息,除了其依赖项是什么。这是一件好事,而不是坏事。
GordonM '18

12

单个类中有40种方法。

将某些功能移入其他类(适当命名的类)是否有意义。这样就更容易理解了。

当您的书数减少时,按自然的阅读顺序列出它们会容易得多。一种常见的范例是需要它们之前之后按照需要的顺序列出它们。

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


1
您说得对-这不是订购问题
kostja 2011年

4
您并非总是有选择的,例如,如果要使用许多方法来实现接口。
finnw 2011年

5
这是一个Android活动,所以有很多其他地方都无法进入onPause()onResume()等等,以及我的所有OnClickListener字段,尽管它们是字段,但看起来或行为都不像它们,所以明智的做法是分别列出。
弗雷德里(Fredley)2011年

@finnw,抽象类很好并且可以用于此目的。
托尔比约恩Ravn的安德森

11

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



1

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.