Skip to content

Commit 3fc7d8e

Browse files
committed
Merge pull request giantray#2 from peiquan/master
Does-Java-support-default-parameter-values.md
2 parents 203f954 + b72ea5d commit 3fc7d8e

File tree

1 file changed

+127
-0
lines changed

1 file changed

+127
-0
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
# Java 是否支持默认的参数值?
2+
3+
在 c++ 中,常见到如下的方法定义(param3 默认为 false):
4+
5+
```
6+
void MyParameterizedFunction(String param1, int param2, bool param3=false);
7+
```
8+
9+
那在 java 中,是否也支持这样的定义方式?
10+
11+
答案是否定的,不过我们可以通过多种方式处理这种参数默认值的情况。
12+
13+
### 创建者模式
14+
使用创建者模式,你可以设定部分参数是有默认值,部分参数是可选的。如:
15+
16+
```
17+
Student s1 = new StudentBuilder().name("Eli").buildStudent();
18+
Student s2 = new StudentBuilder()
19+
.name("Spicoli")
20+
.age(16)
21+
.motto("Aloha, Mr Hand")
22+
.buildStudent();
23+
```
24+
25+
26+
### 方法(构造函数)重载
27+
如:
28+
29+
```
30+
void foo(String a, Integer b) {
31+
//...
32+
}
33+
34+
void foo(String a) {
35+
foo(a, 0); // here, 0 is a default value for b
36+
}
37+
38+
foo("a", 2);
39+
foo("a");
40+
```
41+
构造函数重载,对于参数比较少的情况下,比较适合;当参数相对多的时候,可以考虑使用静态工厂方法,或添加一个参数辅助对象。
42+
43+
如果是常规方法重载,可以考虑使用 参数辅助对象,或者重命名多种情况(比如说,有多个开银行卡的重载方法,可以根据需要重命名为 开交行卡,开招行卡 等多种方法)。
44+
45+
### null 的传递
46+
当有多个默认参数时,可以考虑传递 null,当参数为 null 时,将参数设为 默认值。如:
47+
48+
```
49+
void foo(String a, Integer b, Integer c) {
50+
b = b != null ? b : 0;
51+
c = c != null ? c : 0;
52+
//...
53+
}
54+
55+
foo("a", null, 2);
56+
```
57+
58+
### 多参数方式
59+
当有多个参数,且某些参数可以忽略不设置的情况下,可以考虑使用多参数方式。
60+
61+
- 可选的参数类型的一致
62+
63+
```
64+
void foo(String a, Integer... b) {
65+
Integer b1 = b.length > 0 ? b[0] : 0;
66+
Integer b2 = b.length > 1 ? b[1] : 0;
67+
//...
68+
}
69+
70+
foo("a");
71+
foo("a", 1, 2);
72+
```
73+
74+
- 可选参数类型不一致
75+
76+
```
77+
void foo(String a, Object... b) {
78+
Integer b1 = 0;
79+
String b2 = "";
80+
if (b.length > 0) {
81+
if (!(b[0] instanceof Integer)) {
82+
throw new IllegalArgumentException("...");
83+
}
84+
b1 = (Integer)b[0];
85+
}
86+
if (b.length > 1) {
87+
if (!(b[1] instanceof String)) {
88+
throw new IllegalArgumentException("...");
89+
}
90+
b2 = (String)b[1];
91+
//...
92+
}
93+
//...
94+
}
95+
96+
foo("a");
97+
foo("a", 1);
98+
foo("a", 1, "b2");
99+
```
100+
101+
### 使用 Map 作为方法中的参数
102+
当参数很多,且大部分参数都会使用默认值的情况,可以使用 Map 作为方法中的参数。
103+
104+
```
105+
void foo(Map<String, Object> parameters) {
106+
String a = "";
107+
Integer b = 0;
108+
if (parameters.containsKey("a")) {
109+
if (!(parameters.get("a") instanceof Integer)) {
110+
throw new IllegalArgumentException("...");
111+
}
112+
a = (String)parameters.get("a");
113+
}
114+
if (parameters.containsKey("b")) {
115+
//...
116+
}
117+
//...
118+
}
119+
120+
foo(ImmutableMap.<String, Object>of(
121+
"a", "a",
122+
"b", 2,
123+
"d", "value"));
124+
```
125+
126+
127+
stackoverflow原址:https://stackoverflow.com/questions/997482/does-java-support-default-parameter-values

0 commit comments

Comments
 (0)