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说,这在实际实现中是一个很好的保护措施