soc*_*ose 59 java parameters android
有人可以给我一些在函数中使用输出参数的示例代码吗?我试过谷歌它,但只是在功能中找到它.我想在另一个函数中使用此输出值.
我正在开发的代码旨在在Android中运行.
pol*_*nts 106
Java按值传递; 没有outC#中的参数.
您可以使用return或改变作为引用传递的对象(按值).
public class FunctionSample {
static String fReturn() {
return "Hello!";
}
static void fArgNoWorkie(String s) {
s = "What am I doing???"; // Doesn't "work"! Java passes by value!
}
static void fMutate(StringBuilder sb) {
sb.append("Here you go!");
}
public static void main(String[] args) {
String s = null;
s = fReturn();
System.out.println(s); // prints "Hello!"
fArgNoWorkie(s);
System.out.println(s); // prints "Hello!"
StringBuilder sb = new StringBuilder();
fMutate(sb);
s = sb.toString();
System.out.println(s); // prints "Here you go!"
}
}
Run Code Online (Sandbox Code Playgroud)
至于OP需要帮助的代码,这是使用特殊值(通常null用于引用类型)来指示成功/失败的典型解决方案:
代替:
String oPerson= null;
if (CheckAddress("5556", oPerson)) {
print(oPerson); // DOESN'T "WORK"! Java passes by value; String is immutable!
}
private boolean CheckAddress(String iAddress, String oPerson) {
// on search succeeded:
oPerson = something; // DOESN'T "WORK"!
return true;
:
// on search failed:
return false;
}
Run Code Online (Sandbox Code Playgroud)
String改为使用返回类型null来指示失败.
String person = checkAddress("5556");
if (person != null) {
print(person);
}
private String checkAddress(String address) {
// on search succeeded:
return something;
:
// on search failed:
return null;
}
Run Code Online (Sandbox Code Playgroud)
这是如何java.io.BufferedReader.readLine()工作的,例如:它返回instanceof String(可能是一个空字符串!),直到它返回null以指示"搜索"结束.
当然,这不限于参考类型返回值.关键是必须有一些永远不是有效值的特殊值,并且您将该值用于特殊目的.
另一个经典示例是String.indexOf:它返回-1以指示搜索失败.
注:因为Java没有"输入"和"输出"的参数,使用的概念
i-和o-前缀(如iAddress,oPerson)是不必要的,unidiomatic.
如果您需要返回多个值,通常它们会以某种方式相关(例如x,y单个坐标Point).最好的解决方案是将这些值封装在一起.人们使用过Object[]一种List<Object>或一种通用的Pair<T1,T2>,但实际上,你自己的类型最好.
对于这个问题,我建议使用这样的不可变SearchResult类型来封装boolean和String搜索结果:
public class SearchResult {
public final String name;
public final boolean isFound;
public SearchResult(String name, boolean isFound) {
this.name = name;
this.isFound = isFound;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在搜索功能中执行以下操作:
private SearchResult checkAddress(String address) {
// on address search succeed
return new SearchResult(foundName, true);
:
// on address search failed
return new SearchResult(null, false);
}
Run Code Online (Sandbox Code Playgroud)
然后你像这样使用它:
SearchResult sr = checkAddress("5556");
if (sr.isFound) {
String name = sr.name;
//...
}
Run Code Online (Sandbox Code Playgroud)
如果您愿意,您可以(并且可能应该)将final不可变字段设为非public,并使用publicgetter代替.
您可以使用:
返回X。这将仅返回一个值。
返回对象。将返回一个完整的对象。例如,您的对象可能包含X,Y和Z值。
传递数组。数组通过引用传递。即,如果您传递整数数组,在方法内部修改了数组,则原始代码将看到更改。
传递数组的示例。
void methodOne{
int [] arr = {1,2,3};
methodTwo(arr);
...//print arr here
}
void methodTwo(int [] arr){
for (int i=0; i<arr.length;i++){
arr[i]+=3;
}
}
Run Code Online (Sandbox Code Playgroud)
这将打印出:4,5,6。
作为一种解决方法,可以使用通用的"ObjectHolder".请参阅下面的代码示例
示例输出是:
name: John Doe
dob:1953-12-17
name: Jim Miller
dob:1947-04-18
Run Code Online (Sandbox Code Playgroud)
所以Person参数已被修改,因为它被包装在Holder中,它通过值传递 - 内部的泛型param是一个可以修改内容的引用 - 所以实际上返回了一个不同的人并且原始保持原样.
/**
* show work around for missing call by reference in java
*/
public class OutparamTest {
/**
* a test class to be used as parameter
*/
public static class Person {
public String name;
public String dob;
public void show() {
System.out.println("name: "+name+"\ndob:"+dob);
}
}
/**
* ObjectHolder (Generic ParameterWrapper)
*/
public static class ObjectHolder<T> {
public ObjectHolder(T param) {
this.param=param;
}
public T param;
}
/**
* ObjectHolder is substitute for missing "out" parameter
*/
public static void setPersonData(ObjectHolder<Person> personHolder,String name,String dob) {
// Holder needs to be dereferenced to get access to content
personHolder.param=new Person();
personHolder.param.name=name;
personHolder.param.dob=dob;
}
/**
* show how it works
*/
public static void main(String args[]) {
Person jim=new Person();
jim.name="Jim Miller";
jim.dob="1947-04-18";
ObjectHolder<Person> testPersonHolder=new ObjectHolder(jim);
// modify the testPersonHolder person content by actually creating and returning
// a new Person in the "out parameter"
setPersonData(testPersonHolder,"John Doe","1953-12-17");
testPersonHolder.param.show();
jim.show();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
129172 次 |
| 最近记录: |