gpt4 book ai didi

Java - 使用相同数据类型的多个构造函数

转载 作者:行者123 更新时间:2023-11-29 04:13:07 25 4
gpt4 key购买 nike

我们如何创建构造函数来设置来自相同数据类型的不同值?

不可能两个创建两个相同的构造函数:

public User(int age, String name){
}
public User(int age, String surname){
}

用户 user1 = new User(33, Jack);
用户 user2 = new User(33, 麻雀);

由于 name 和 surname 都来自相同的数据类型,因此不可能知道用户打算设置哪个值。


我们可以创建一个具有所有属性的构造函数,然后为未设置的参数传递 null。

public User(int age, String name, String surname){
}

用户 user1 = new User(33, Jack);
用户 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

}

}

有没有更优雅的方法呢?

最佳答案

执行此操作的典型方法是使用静态创建方法或构建器对象。

如果有不同的使用模式,静态创建方法是可行的方法。对于您的示例(情况可能并非如此)。

public static User ageName(int age, String name) {
...
}
public static User ageSurname(int age, String surname) {
...
}
...

一般来说,避免任何重载是个好主意。对于构造函数,Java 宁愿强制您使用它,但有时您必须挣脱束缚。

Builder 可能会像这样:

public class UserBuilder { // This could be made a nested class of User
private int age = -1;
private String name;
private String surname;
private Color hairColor;

public UserBuilder age(int age) {
this.age = age;
return this;
}
// ... other properties ...
public User build() {
// Or return new User(this)
return new User(age, name, surname, hairColor);
}
}

这使用了在构建器中返回 this 的典型 Java 肮脏 hack,因此您可以构建火车残骸。

User user1 = new UserBuilder().age(33).name("Jack").build();

您确实需要真实的用法示例才能了解它应该如何适用。

关于Java - 使用相同数据类型的多个构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53904160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com