Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit b72ea5d

Browse filesBrowse files
author
zhupeiquan
committed
Does-Java-support-default-parameter-values.md
1 parent 203f954 commit b72ea5d
Copy full SHA for b72ea5d

File tree

Expand file treeCollapse file tree

1 file changed

+127
-0
lines changed
Filter options
Expand file treeCollapse file tree

1 file changed

+127
-0
lines changed
+127Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.