【问题标题】:Forcing specific characteristics for a series of parameters强制一系列参数的特定特征
【发布时间】:2015-08-25 16:58:31
【问题描述】:

我正在创建一个带有接受多个参数的构造函数的 Java 类。在这些参数中,选择具有完全相同的限制:

  1. 它们可以为空。
  2. 它们可以有一个项目(在这种情况下,我在本例中称为“链接”的对象,但也可以是许多其他对象),但必须将其嵌入到 ArrayList 中以简化所有内容稍后。
  3. 它们可以是特定类型的 ArrayList(本例中为链接)。

到目前为止我的代码(忽略简单的“公共类链接”的链接类):

public class Item {
    public ArrayList<Link> Links;
    public String OtherThing;
    public Item(Object Links, String OtherThing) {
        this.Sources = prepareArrayList(Links, Link);
        this.OtherThing = OtherThing;
    }
    public Item() {}
    private ArrayList prepareArrayList(Object Object, Object Type) {
        if(Type.isInstance(Object)) {
            return new ArrayList<Type>(Arrays.asList((Type) Object));
        } else if (Object instanceof ArrayList<?>) {
            if(!((ArrayList<?>) Object).isEmpty()) {
                if(Type.isInstance(((ArrayList<?>) Object).get(0))) {
                    return (ArrayList<Type>) Object;
                }
            }
        }
        return null;
    }
}

目前这甚至没有达到编译,因为我不能将 Type 参数作为 ArrayList 的类型传递。经过大量研究后,很明显我做错了什么。

如果我为单一类型执行此操作,例如 Link,它可以正常工作(见下文),但我需要它适用于每种类型,其中我有大约 8 个,因此运行它很棘手每一个都有逻辑。

 private ArrayList prepareArrayList(Object Object) {
        if(Link.isInstance(Object)) {
            return new ArrayList<Link>(Arrays.asList((Link) Object));
        } else if (Object instanceof ArrayList<?>) {
            if(!((ArrayList<?>) Object).isEmpty()) {
                if(Link.isInstance(((ArrayList<?>) Object).get(0))) {
                    return (ArrayList<Link>) Object;
                }
            }
        }
        return null;
    }

效果很好。有没有可能我需要使用某种接口或另一个类来让它工作?可能是自定义 ArrayList 扩展?谢谢。

【问题讨论】:

  • 如果您只使用Link,为什么要使用Object 而不是LinkList&lt;Link&gt;
  • @RealSkeptic 抱歉,我的问题写错了,我现在改正。除了使用 Link 之外,还有不同的类型。我让它按照你提到的方式完美地工作,但是我不得不为除了 Link 之外的不同对象重复大约 8 次。
  • 好的,那么为什么不将Item 设为通用呢?请注意,如果您将内容存储在其中的 Array&lt;Link&gt; 中,您将无法在其中放入除 Link 之外的任何内容。
  • 嗯,这就是我使用函数的原因,还有其他参数,如字符串。我已经快速更新了主要代码。

标签: java class object types parameters


【解决方案1】:

我不会将您的内部实现需要ArrayList 与参数类型混为一谈。最重要的是,您的构造函数应该能够接收一个或多个Links。您可以提供Collection&lt;Link&gt; 构造函数和/或Link... 构造函数并自己创建ArrayList

public Item(Collection<Link> links) {
    this.sources = new ArrayList(links);
}

public Item(Link... links) {
    this(Arrays.asList(links));
}

【讨论】:

  • 如果我只有一个参数,这将非常有用。问题是我有几个不同的参数,它们都可以在一个链接、链接的 ArrayList 和 null 之间交替。我不确定这种技术是否会奏效 - 好吧,它会,但效果不会很好。
  • @Furza 如果您有很多参数,那么您应该考虑构建器模式,而不是尝试将它们传递给构造函数。这将允许您将它们中的每一个都放在单个/可变参数/集合形式中。
  • @RealSkeptic 实际上,我现在正在看那个!
猜你喜欢
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 2013-10-31
  • 1970-01-01
  • 2018-10-20
  • 2020-09-08
  • 2018-04-11
  • 1970-01-01
相关资源
最近更新 更多