Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何明确方法的参数用作返回值?_Java_Oop_Design Patterns - Fatal编程技术网

Java 如何明确方法的参数用作返回值?

Java 如何明确方法的参数用作返回值?,java,oop,design-patterns,Java,Oop,Design Patterns,有没有办法表明方法的参数用作返回值 如果我想返回一个值,这没有问题: public Set<Integer> addIntegerToSet(final int i) { Set<Integer> intSet = new HashSet<>(); intSet.add(i); return intSet; } public Set addIntegerToSet(final int i){ Set intSet=new HashS

有没有办法表明方法的参数用作返回值

如果我想返回一个值,这没有问题:

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

    return intSet;
}
public Set addIntegerToSet(final int i){
Set intSet=new HashSet();
添加(i);
返回整数集;
}
很容易看出该方法返回一个集合

但如果我想让一个方法返回两个值,我需要一个变通方法:

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

    returnIntMap.add(i);

    return intSet;
}
public Set addIntegerToSet(final int i,Set returnIntMap){
Set intSet=new HashSet();
添加(i);
添加(i);
返回整数集;
}
这两段代码只是说明我的问题的示例,它们没有实际用途

但是,我想让用户清楚地看到,这个集合(
returnIntMap
)也被操纵过。通常的做法是将“final”放在方法中未操作的参数前面,但这样做的结果是不正确的,即使在Java标准类中也不例外


那么,我如何显示
returnIntMap
是在方法中操作的,而不只是在java文档注释中提到它。有什么约定吗?

首先,你可以这样做-

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.
}
publicstaticset-addIntegersToSet(Set-Set,finalint…arr){

//首先,你可以这样做-

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.
}
publicstaticset-addIntegersToSet(Set-Set,finalint…arr){

//你想做的是对你的方法参数做一个传递引用。这在Java中不会发生。Java做一个传递值。

你想做的是对你的方法参数做一个传递引用。这在Java中不会发生。Java做一个传递值。

我说的是一个变通方法。
因为您正在传递集合,而该方法也在返回集合。因此,您可以在调用方法中比较它们是否发生了更改。

(您可以通过
firstSet.equals(secondSet)
firstSet.containsAll(secondSet)
实现比较)

我说的是一种变通方法。
因为您正在传递集合,而该方法也在返回集合。因此,您可以在调用方法中比较它们是否发生了更改。

(您可以通过
firstSet.equals(secondSet)
firstSet.containsAll(secondSet)
实现比较)

您不能真正将参数标记为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
}
公共类ReturnParam{
私有最终集;
私人最终设定返回地图;
公共ReturnParam(最终集intSet,最终集returnIntMap){
this.intSet=intSet;
this.returnIntMap=returnIntMap;
}
公共集getIntSet(){
返回整数集;
}
公共集getReturnIntMap(){
返回地图;
}
}
//你的方法可能是这样的
public ReturnParam addIntegerToSet(最终int i){
Set intSet=new HashSet();
Set returnIntMap=new HashSet();
添加(i);
添加(i);
return new ReturnParam(intSet,returnIntMap);//将其放入ReturnParam包装类
}

您不能真正将参数标记为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
}
公共类ReturnParam{
私有最终集;
私人最终设定返回地图;
公共ReturnParam(最终集intSet,最终集returnIntMap){
this.intSet=intSet;
this.returnIntMap=returnIntMap;
}
公共集getIntSet(){
返回整数集;
}
公共集getReturnIntMap(){
返回地图;
}
}
//你的方法可能是这样的
public ReturnParam addIntegerToSet(最终int i){
Set intSet=new HashSet();
Set returnIntMap=new HashSet();
添加(i);
添加(i);
return new ReturnParam(intSet,returnIntMap);//将其放入ReturnParam包装类
}

这在Java中是不可能直接实现的

Java使用按值传递。对象和数组实际上是指针,因此,尽管它看起来像按引用传递,但实际上引用是作为值传递的。这意味着您可以修改对象,但不能修改对它的引用

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

即使从技术上讲只能返回一个对象,但没有什么可以阻止您返回将多个新对象封装到一个容器中的容器


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

在Java中不直接可能

Java使用按值传递。对象和数组实际上是指针,因此,尽管它看起来像按引用传递,但实际上引用是作为值传递的。这意味着您可以修改对象,但不能修改对它的引用

final
没有太多的使用,因为它只是声明指针不能修改,但它指向的对象可以修改。因此,在公共接口中将方法的参数声明为
final
没有太多用处。thoug说,这在实际实现中是一个很好的保护措施