将构造函数作为参数传递给方法

3

我刚开始学习Java,正在学习构造函数。我发现有些例子中将构造函数作为参数传递给方法。请告诉我当构造函数作为方法的参数时会发生什么,或者建议我一些链接,以获取关于使用构造函数的足够知识。


7
“我看到一些例子,其中构造函数被作为参数传递给一个方法。”- 虽然在Java中这是可行的,但我感觉你想表达的不是你所写的。你能举个例子吗? - Turing85
欢迎来到 Stack Overflow!请参观 [导览],四处浏览,并阅读 [帮助],特别是 如何提问好问题? "我看到有些例子,在参数中传递构造函数的方法。" 这很不可能。请发一份你看到的让你产生这种想法的示例。 - T.J. Crowder
@Turing85 “虽然在Java中这是可能的”,但我实际上很好奇如何将构造函数作为参数传递。您是否有任何相关链接或示例代码? - user3437460
@user3437460的回答(https://dev59.com/C6rka4cB1Zd3GeqPk-dD#50027030)中有一个指向baeldung的链接。那里有一些示例。 - Turing85
3个回答

6

根据您需要传递构造函数的目的,您可以考虑传递Supplier实例而不是构造函数(JavaDoc-https://docs.oracle.com/javase/8/docs/api/java/util/function/Supplier.html)。 例如,您有一个方法,该方法应该创建一个账户并填写所有内容。您可以将此方法设置为接受Supplier作为参数:

public Account createNewAccount(Supplier<Account> accountConstructor) {
    var account = accountConstructor.get();
    account.fillEverything();
    return account;
}

接下来,您可以使用lambda将构造函数传递给此方法:

createNewAccount(() -> new UserAccount());

或者使用方法引用:

createNewAccount(UserAccount::new);

两种变体都能正常工作。

这不是“什么”,而是“如何”。如果您链接到网站,应该给出简短的描述以防止网站崩溃。 - Turing85

0
这是一个示例类,它包含两个构造函数作为实例变量,并在调用constructItem方法时调用其中一个。第一个构造函数被存储为返回类型为SSupplier对象,而第二个构造函数则接受一个以类型T为参数并返回类型SFunction对象。
public class ConstructorWrapper<T, S> {

    private final Supplier<S> construct;
    private final Function<T, S> constructFromObject;

    public ConstructorWrapper(Supplier<S> constructWithNothing, Function<T, S> constructWithObject) {
        this.construct = constructWithNothing;
        this.constructFromObject = constructWithObject;
    }

    public S constructItem(T k) {
        if (k != null) return this.construct.get();
        else return constructFromObject.apply(k);
    }
}

我们可以像这样使用类来将从集合创建ArrayLists进行包装。通过不带参数调用构造函数创建x,通过带一个参数调用构造函数创建y
ConstructorWrapper<Set, ArrayList> setToArrayList = new ConstructorWrapper<>(ArrayList::new, ArrayList::new);
ArrayList x = setToArrayList.constructItem(null);
ArrayList y = setToArrayList.constructItem(new HashSet<>());

或者像这样从ArrayList创建Sets:

ConstructorWrapper<ArrayList, HashSet> arrayListsToSets = new ConstructorWrapper<>(HashSet::new, HashSet::new);
HashSet x = arrayListsToSets.constructItem(null);
HashSet y = arrayListsToSets.constructItem(new ArrayList<>());

我使用了原始的ArrayList和Set,因为我不想在代码中增加更多的泛型而使其凌乱。


0

构造函数可以使用方法引用作为参数传递给方法,有点像C++中的函数指针。

参见:http://www.baeldung.com/java-8-double-colon-operator

这可以是一个带有一个参数的Function类型或带有两个参数的BiFunction类型,无论哪种方式,它都是返回其构造的类型的lambda。

不过,就像Turing85所说,我认为这不是你想要的。将构造函数作为参数传递是一个相当小众的用例。如果您只想了解构造函数的信息,

https://docs.oracle.com/javase/tutorial/java/javaOO/constructors.html


2
“就像Turing85所说,我不认为这是你想要的。” - 那么你为什么要发表一种推测性的答案呢?=) - Turing85
请注意,还有来自反射Constructor类。它也可以用于动态创建实例,使用constr.newInstance(...)文档)。 - Zabuzard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接