java - Java - 使用相同数据类型的多个构造函数
问题描述
我们如何创建构造函数来设置来自相同数据类型的不同值?
不可能的两个创建两个相同的构造函数:
public User(int age, String name){
}
public User(int age, String surname){
}
用户 user1 = 新用户(33,杰克);
用户 user2 = 新用户(33,麻雀);
由于 name 和 surname 都来自相同的数据类型,因此不可能知道用户打算设置哪个值。
我们可以创建一个具有所有属性的构造函数,然后将 null 传递给未设置的参数。
public User(int age, String name, String surname){
}
用户 user1 = 新用户(33,杰克);
用户 user2 = new User(33, null, Sparrow );
有一种方法可以使用 HashMap 模仿 javascript 对象文字。
package javaapplication;
import java.awt.Color;
import java.util.HashMap;
public class JavaApplication {
public static class User {
public int age;
public String name;
public String surname;
public Color hairColor;
public User(HashMap<String, Object> arguments) {
if (arguments.containsKey("hairColor")) {
this.hairColor = (Color) arguments.get("hairColor");
}
if (arguments.containsKey("name")) {
this.name = (String) arguments.get("name");
}
if (arguments.containsKey("surname")) {
this.surname = (String) arguments.get("surname");
}
if (arguments.containsKey("age")) {
this.age = (int) arguments.get("age");
}
}
}
public static void main(String[] args) {
User jack1 = new User(new HashMap<String, Object>() {
{
put("hairColor", Color.RED);
put("name", "Jack");
put("age", 33);
}
});
System.out.println(jack1.hairColor); // java.awt.Color[r=255,g=0,b=0]
System.out.println(jack1.surname); // null
System.out.println(jack1.name); // Jack
System.out.println(jack1.age); // 33
User jack2 = new User(new HashMap<String, Object>() {
{
put("hairColor", Color.RED);
put("surname", "Sparrow");
put("age", 33);
}
});
System.out.println(jack2.hairColor); // java.awt.Color[r=255,g=0,b=0]
System.out.println(jack2.surname); // Sparrow
System.out.println(jack2.name); // null
System.out.println(jack2.age); // 33
}
}
有没有更优雅的方法来做到这一点?
解决方案
您在这里使用 HashMap 会使事情变得过于复杂。相反,您可以使用Builder 模式。
class User {
// required parameters
private int age;
// optional parameters
private String name;
private String surname;
public int getAge() {
return age;
}
public String getName() {
return name;
}
public String getSurname() {
return surname;
}
private User(UserBuilder userBuilder) {
this.age = userBuilder.age;
this.name = userBuilder.name;
this.surname = userBuilder.surname;
}
public static class UserBuilder {
// required parameters
private int age;
// optional parameters
private String name;
private String surname;
public UserBuilder setName(String name) {
this.name = name;
return this;
}
public UserBuilder setSurname(String surname) {
this.surname = surname;
return this;
}
public UserBuilder(int age) {
this.age = age;
}
public User build() {
return new User(this);
}
}
}
现在你可以使用它了:
User user1 = new User.UserBuilder(12).setName("Jack").build();
User user2 = new User.UserBuilder(12).setSurname("Sparrow").build();
这假定这age
是一个必填字段,name
并且surname
是用于创建对象的可选User
字段。您可以根据您的要求进行相应的调整。
推荐阅读
- python - ModuleNotFoundError:没有名为“sentiment_mod”的模块
- python - 合并缺少键的字典以创建组合字典
- python - 使除以零等于列表中的零
- hive - 用 Hive 中的其他值替换列值
- python - Django Ajax - POST 请求成功,数据未保存在数据库中
- python - 使用 numpy where:对于黑色单元格,将新值放入列中
- ruby-on-rails - 多个用户在 Ruby on Rails 中执行一项任务
- ruby-on-rails - 带有服务器呈现的 html 表单的 phonegap 产生空引用者错误
- angular - AG-Grid单元相互依赖
- json - 在 JSON 对象中编码文件内容