【问题标题】:Java - How many objects of objects can you have?Java - 您可以拥有多少个对象?
【发布时间】:2017-02-16 19:32:46
【问题描述】:

所以我有一个包含用户对象的链表:

(USLinkedList是我创建的链表数据结构的名称)

(Users 是我创建的一个类)

      private USLinkedList<User> users;

我想要一个数组来保存这些链表的对象:

      private USLinkedList<User> dates[];

我想要另一个数组来保存上述数组的对象:

      private USLinkedList<User> dates[] months[];

我终于希望这个数组进入一个链表:

      private USLinkedList<USLinkedList<User> dates[] months[]> years;

我想知道:

  • 如果这样的事情是可能的?
  • 如果可能的话,我的语法是否正确,即我的代码是否正确?
  • 做这样的事情是好的编程习惯吗?

谢谢大家!

【问题讨论】:

  • 拥有复杂的数组结构通常是一个好兆头,表明您希望将某些内容封装在一个对象中并且只拥有该对象的列表。
  • 这是一个公平的观点,我会尝试这样的。
  • 您的语法不正确。 USLinkedList&lt;User&gt; dates[] months[];USLinkedList&lt;USLinkedList&lt;User&gt; dates[] months[]&gt; 没有向您抛出编译器错误?
  • 正确的语法是什么?

标签: java arrays object generics linked-list


【解决方案1】:

是的,不,也许,按这个顺序。

你能做到吗?你可以拥有你需要的任何深度的集合。

语法对吗?语法和你描述的不一样。这会渗入“良好实践”的讨论中,但是像您那样混合列表和数组似乎是任意的,并且可能会导致语法混乱。当然,您的访问模式可能证明将某些级别组织为链表而将其他级别组织为数组是合理的,但是对于这两种情况都有 List 实现,我建议使用它们来保持一致性。因此,我展示的示例将是正确的语法。

这是一种好的做法吗?这有几个方面。

数据结构本身?好吧,如果您需要以这种方式组织的数据结构,那么这就是您所需要的。如果更简单的东西可以直观地满足要求,那么这是不好的做法;但如果这是做你需要做的事情的简单、直观的方法,那就没问题了。

USLinkedList 的实现对我来说有点问号。也许它做了提供的 List 实现不能做的事情;但如果是这样,从你所说的情况来看并不明显。如果java.util.LinkedList&lt;User&gt; 可以工作,那么使用它比重新发明轮子更好。即使您出于某种原因确实需要自己的USLinkedList,如果可能的话,它应该实现List 接口,并且最好引用应该将其寻址为List

如上所述,我不会在没有充分理由的情况下混合使用数组和列表。 LinkedListArrayList(或 Vector,取决于同步需要)应该可以正常工作,并允许您始终如一地使用 List 接口。

回到语法...

我建议使用接口类型作为引用,我建议使用泛型。所以你有

private List<User> users;

你可以用它来填充

users = new LinkedList<User>();

(如果确实需要自定义列表实现,可以将LinkedList&lt;User&gt;全程替换为USLinkedList&lt;User&gt;,如果不能实现List接口,也可以将List&lt;User&gt;替换为`USLilnkedList。 )

下一行,

private List<List<User>> dates;

dates = new ArrayList<List<User>>();
dates.add(new LinkeList<User>()); // or whatever...

然后

private List<List<List<User>>> months;

months = new ArrayList<List<List<User>>>();
//etc.

private List<List<List<List<User>>>> years;
// well, you get the idea, right?

但同样,所有这一切都假设这种多级索引有充分的理由。你可以,如果它确实是满足你需要的直接方法,那很好......但我不得不说我不记得我上次需要这样一个嵌套结构是什么时候。

【讨论】:

  • 谢谢,我认为这是迄今为止最好的回应!关键是我们必须创建自己的数据结构,所以我们不能使用任何 java 预先存在的数据结构。
  • 但我想我会制作更多对象并将这些对象存储在最终的链表中。
  • 不要使用java.util.Vector,已经过时了近19年。
  • @LewBloch - 有趣的是,JavaDoc 并没有说它已被弃用。事实上,在 Java 1.2(19 年前)中,他们专门将 Vector 改进为 Collections API。很久以后,他们添加了通用支持。这似乎不像你所做的那样表明某些东西被认为是过时的。您是否有来源(即比 JavaDoc 更权威的来源),或者这仅仅是您的意见?
  • @MarkAdelsberger Vector 的同步是在每个元素级别上进行的,因此几乎没有用处。它可能不会被弃用,因为很多早期的 API 都依赖它。至于来源,快速搜索出现了docs.oracle.com/cd/A97688_16/generic.903/bp/java.htm#1007005blogs.oracle.com/geertjan/entry/oh_no_vector
【解决方案2】:

private USLinkedList<User> dates[] months[]; private USLinkedList<USLinkedList<User> dates[] months[]> years;

这两种情况的语法都不正确,即使是,这也只是令人困惑。

Java 是一种 oop 语言,oop 用于让我们人类的事情变得更简单。

我认为正确的方法是创建一个包含 private USLinkedList&lt;User&gt; dates[]; 的对象 Dates 然后创建一个包含 private USLinkedList&lt;Dates&gt; month;

的 MonthDates 对象

然后创建另一个包含 private USLinkedList&lt;MonthDates&gt; fullDates; 的 FullDates 对象

我知道这意味着你应该创建 3 个新对象,但这样更简单易懂,而且语法正确¯_(ツ)_/¯

【讨论】:

  • 我认为大多数人——包括我自己——会争辩说,如果这些额外的对象只是为了包含一个 List(毕竟它本身已经是一个对象)
  • 是的,有些人会不同意,当然我将每个列表作为一个对象只是为了示例。此外,private USLinkedList&lt;Dates&gt; month; 现在是一个对象这一事实,如果您希望覆盖排序方法或类似的东西,可以为您提供帮助。我希望我试图表明的观点很清楚......
猜你喜欢
  • 1970-01-01
  • 2016-10-31
  • 2020-03-06
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
相关资源
最近更新 更多