gpt4 book ai didi

java - Java 的包装工厂

转载 作者:行者123 更新时间:2023-12-01 16:12:13 26 4
gpt4 key购买 nike

我可能已经把自己设计成一个解决这个问题的角落,但我觉得对于这样的事情有一个可行的已知解决方案,但我没有看到。很可能我把问题完全复杂化了,并跳过了明显的解决方案。任何建议将不胜感激。

我有一组定义为接口(interface)的实体。每个都有一个具体的实现和一个包装器实现。例如:

-- Foo.java
public interface Foo {
public String getName();
}

-- FooImpl.java
public class FooImpl implements Foo {
private String name;

public String getName() {
return name;
}
}

-- AbstractWrapper.java
public class AbstractWrapper {
protected String decorate(String text) {
return "** " + text + " **";
}

-- FooWrapper.java
public class FooWrapper extends AbstractWrapper implements Foo {
private Foo wrappedFoo;

public FooWrapper(Foo wrappedFoo) {
this.wrappedFoo = wrappedFoo;
}

public String getName() {
return decorate(wrappedFoo.getName());
}
}

现在,使情况变得复杂的部分是我试图创建一个列表,在添加之前自动用适当的包装器包装适当的类型。像这样的东西:

-- WrappingList.java

/** T is the base entity interface type. */
public class WrappingList<T> implements List<T> {
private List<T> wrappedList;

public WrappingList(List<T> wrappedList) {
this.wrappedList = wrappedList;
}

....

public boolean add(T item) {
return wrappedList.add(wrapItem(item));
}

protected T wrapItem(T item) {
T wrappedItem = .....;
return T;
}
}

我可以做些什么来在这里创建一个稍微干净的工厂方法吗?或者由于类型删除,我此时已经不走运了?

最佳答案

我认为您应该将 WrapperFactory 添加到 WrappingList 中,并在构造函数中提供实际的工厂实现。像这样的东西:

-- WrapperFactory.java
public class WrapperFactory<T> {

public T wrap(T item);

}

-- WrappingList.java
/**
* A self-wrapping list.
*
* @param T the stored, wrapped item type
*/
public class WrappingList<T> implements List<T> {
private List<T> wrappedList;
private WrapperFactory<T> wrapper;

public WrappingList(List<T> wrappedList, WrapperFactory<T> wrapper) {
this.wrappedList = wrappedList;
this.wrapper = wrapper;
}

....

public boolean add(T item) {
return wrappedList.add(wrapper.wrap(item));
}

}

基本问题是删除不会让您知道实际代码中有关 T 的任何信息,因此除非您向列表传递一些了解您正在使用的特定 T 的内容(例如如何包装它),否则您将不会'什么也做不了。这并不是让您陷入困境;)这只是 Java 泛型的一个常见限制。

关于java - Java 的包装工厂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/691006/

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