代码之家  ›  专栏  ›  技术社区  ›  rampion

JAVA Ad()方法约定

  •  2
  • rampion  · 技术社区  · 14 年前

    所以,我通常是一个Ruby程序员,所以我对Java约定的掌握充其量是不稳定的。如果我有一个类A,并且想要定义一个方法来添加该类的两个实例,那么关于行为和返回类型的约定是什么?

    public class A
    {
        //...
        public NotSureWhatTypeItShouldReturn add (A that) { /* ... */ }
    

    我应该

    • 返回指示成功的布尔值并修改目标,或者
    • 返回目标的修改副本,并在出错时引发异常

    这种方法适合于普通的Java约定吗?

    7 回复  |  直到 14 年前
        1
  •  3
  •   Lie Ryan Bryan    14 年前

    这里的每个人都在考虑collections.add()-type方法;但我怀疑这就是您所想的。你更倾向于说, Vector2D.add() 哪个将vector2d的x和y分量相加?

    在Java中,据我所知,集合通常会修改它们自己(集合也是如此)。

    但是,非集合对象(例如vector2d)的变化更大。在我看到的惯例中:

    1. Cls add(Cls b) 它返回一个新对象,不修改现有实例
    2. void add(Cls b) 修改的 this 不返回任何内容(即返回void),不应修改 b . 没有返回的意义 bool 因为这种类型的添加永远不应该失败(如果它仍然失败,则应该有例外)。
    3. Cls add(Cls a, Cls b) 它返回一个新对象,既不修改a也不修改b。cls.add()是cls类中的静态方法。

    就我个人而言,我更喜欢算术样式a d d()的第一种样式;正因为我们可以执行a.a d d(b).a d d(c).a d d(d),它看起来有点像“a+b+c+d”。(我通常不会这样做,如果 a 是集合;因为集合对象的串行添加看起来很奇怪。)

        2
  •  6
  •   Michael Mrozek    14 年前

    两者都存在: Collection.add 修改集合并返回布尔值,以及 BigInteger.add 返回新的 BigInteger 它保存了原始实例和传入实例的总和。

    我通常希望大多数方法修改它们被调用的实例,而不是返回同一类型的新对象,但是如果有一个很好的用例来保持实例的常量并始终返回一个新实例,那么您当然可以这样做。

        3
  •  5
  •   Jon Skeet    14 年前

    不要返回布尔值,除非它是“预期失败”,例如尝试添加到集合中。如果事情真的发生了 错误的 ,引发异常。

    现在,你 能够 返回修改过的副本-或者可以添加到现有对象。不变性通常是一个很好的属性…但是Java中的大多数集合都是可变的。如果你走的是不变的路线,你可能会想 考虑 使用 plus 而不是 add -它给人的感觉更多的是“你应该看到一个结果,而我不会改变目标”在我看来。

        4
  •  1
  •   stacker    14 年前

    我会推荐和 Collection.add ,这就是我所期望的。

        5
  •  0
  •   MikeD    14 年前

    从Java Collections API :

    确保此集合包含指定的元素(可选操作)。如果此集合因调用而更改,则返回true。(如果此集合不允许重复,并且已包含指定元素,则返回false。)

    支持此操作的集合可能会限制哪些元素可以添加到此集合中。特别是,一些集合将拒绝添加空元素,而其他集合将对可能添加的元素类型施加限制。集合类应该在它们的文档中明确地指定可以添加哪些元素的任何限制。

    如果集合由于某个特定元素已经包含该元素以外的任何原因而拒绝添加该元素,则它必须引发异常(而不是返回false)。这将保留集合在该调用返回后始终包含指定元素的不变量。

        6
  •  0
  •   polygenelubricants    14 年前

    这不是一个惯例,而是 boolean Collection<E>.add(E) 例证:

    返回: true 如果此集合由于调用而更改
    投掷: UnsupportedOperationException -如果 add 此集合不支持操作

    Java集合框架类的方法很少返回它们调用的集合。也就是说,支持这一点并不惯用:

    mySet.add(thisThing).add(thatThing).add(thoseAlso);
    

    Java库中的一些类使用“流体”样式,例如 Appendable StringBuilder ,但主要的Java集合框架类都没有。

        7
  •  0
  •   OscarRyz    14 年前

    取决于类的语义,但通常是:

    public void add( A that ) {
    } 
    

    如果你只想聚合元素。

    你可以使用:

    public boolean add( A that ) {
    }
    

    如果你想知道结构是否被修改(比如 java.util.Set 或一般的收藏品)

    你可以使用 public A add( A that ){} 如果你的意图是创造一个“建筑者般”的物体(就像 StringBuilder.append 方法。

     A a = new A();
     a.add( a ).add( b ).add( c ).build();
    

    因此,根据类的语义,您也可以使用它们。

    大多数时候(+90%)我做第一个: void add( A other ){}