显示方法的参数作为返回值

时间:2013-12-12 08:57:33

标签: java oop design-patterns

有没有办法显示方法的参数作为返回值?

如果我想返回一个值,那就没问题了:

public Set<Integer> addIntegerToSet(final int i)
{
    Set<Integer> intSet = new HashSet<>();
    intSet.add(i);

    return intSet;
}

很容易看出该方法返回一个集合。

但是如果我想要一个方法来返回两个值,我需要一个解决方法:

public Set<Integer> addIntegerToSet(final int i, Set<Integer> returnIntMap)
{
    Set<Integer> intSet = new HashSet<>();
    intSet.add(i);

    returnIntMap.add(i);

    return intSet;
}

这两段代码只是用来说明我的问题的例子,它们没有实际用途。

但是,我想让用户明白这个集合(returnIntMap)也被操纵了。通常的做法是在方法中没有操作的参数前加上“final”,但是这样做并不是这样,即使在Java标准类中也是如此。

那么,如何在方法中显示returnIntMap被操作,而不仅仅在java doc注释中提及它。有没有约定?

5 个答案:

答案 0 :(得分:2)

在Java中不可能直接实现。

Java使用pass by value。对象和数组实际上是指针,因此即使看起来像是通过引用传递,实际上引用也是作为值传递的。这意味着您可以修改对象,但不能修改对象的引用。

final没有那么多使用,因为它只是声明指针不能被修改,但它指向的对象可以。因此,在公共接口中将方法的参数声明为final没有多大用处。不过,这是实际实施中的一个很好的保障。简而言之:final != const和Java没有等同于const

即使技术上只能返回一个对象,但没有什么可以阻止你将一个包装几个新对象的容器返回到一个对象。

如果您只想(在内部)记录哪些对象被修改,您可以使用注释来标记参数,例如: @ReadOnly@ReadWrite。这些不是我所知道的标准或任何图书馆的一部分,尽管可能存在一个。即使没有,您仍然可以定义自己的注释。

答案 1 :(得分:1)

你想要的是通过引用你的方法参数来传递。这在Java中不会发生。 Java通过值传递。

答案 2 :(得分:1)

您无法将参数标记为IN或IN / OUT。您可以编写更清晰的代码,在新类中包含两个返回参数。因此,您将两个返回参数都作为唯一的返回参数:

public class ReturnParam {
    private final Set<Integer> intSet;
    private final Set<Integer> returnIntMap;

    public ReturnParam(final Set<Integer> intSet, final Set<Integer> returnIntMap) {
        this.intSet = intSet;
        this.returnIntMap = returnIntMap;
    }

    public Set<Integer> getIntSet() {
        return intSet;
    }

    public Set<Integer> getReturnIntMap() {
        return returnIntMap;
    }
}

// and your method could look like this
public ReturnParam addIntegerToSet(final int i) {
    Set<Integer> intSet = new HashSet<>();
    Set<Integer> returnIntMap = new HashSet<>();

    intSet.add(i);
    returnIntMap.add(i);

    return new ReturnParam(intSet, returnIntMap);  // put it into the ReturnParam wrapper class
}

答案 3 :(得分:0)

首先,你可以这样做 -

public static Set<Integer> addIntegersToSet(Set<Integer> set, final int ... arr) { 
                                                      // <-- Receive a Set and a 
                                                      //  variable number of ints.
  for (int i : arr) { // add each int to the set (possibly none to add).
    set.add(i);
  }
  return set; // return the set.
}

然后你可以检查之前(和之后)的设置大小,看看你添加到你的集合中的整数。 要使您的集合不可变,您可以使用Collections.unmodifiableSet。见documentation。但是你不能在Set中添加任何东西。我想你想要以这种方式更改Set时记录。

答案 4 :(得分:0)

我说的是一个解决方法 由于您传递了集合,并且该方法也返回了一个集合。因此,您可以在调用方法中比较它们是否已更改。
(您可以通过firstSet.equals(secondSet)firstSet.containsAll(secondSet))进行比较