Java 何时使用依赖项注入,何时使用继承?

Java 何时使用依赖项注入,何时使用继承?,java,Java,假设我有一个类水果和一个叫做苹果的子类。在水果类中,有一种变量,比如说水果列表之类的。我需要苹果课上的水果清单。因此,我知道如果我在Apple类上编写extends Fruit,那么我就可以从超类访问水果列表(假设列表是受保护的或公共的等等)。那么,我应该使用继承来获取水果列表,还是应该使用依赖注入来以某种方式将列表放入apple类中?这个问题可能很愚蠢,但我对此有点困惑。我知道您只能从一个类进行扩展,所以如果我需要两个水果列表或其他东西,那么我就无法获得另一个具有继承的水果列表。我现在在大多数

假设我有一个类水果和一个叫做苹果的子类。在水果类中,有一种变量,比如说水果列表之类的。我需要苹果课上的水果清单。因此,我知道如果我在Apple类上编写extends Fruit,那么我就可以从超类访问水果列表(假设列表是受保护的或公共的等等)。那么,我应该使用继承来获取水果列表,还是应该使用依赖注入来以某种方式将列表放入apple类中?这个问题可能很愚蠢,但我对此有点困惑。我知道您只能从一个类进行扩展,所以如果我需要两个水果列表或其他东西,那么我就无法获得另一个具有继承的水果列表。我现在在大多数课堂上所做的只是从主课堂上获取水果列表,然后将它注入所有其他需要它的课堂。不确定是将引用注入到对象中,还是仅将值也注入到对象中


那么,我什么时候使用依赖项注入和继承呢?

听起来好像你试图在一个类中做太多的事情。通常,如果您的设计令人困惑,将类拆分可以澄清这一点

在这种情况下,水果
定义如何成为水果,就像苹果
一样,如果它继承自水果,则定义水果如何成为苹果。不同种类水果的清单通常不是水果“知道”的东西,它只是知道它是水果。因此,您需要某种独立的“水果目录”对象(可以根据项目是否为
selectClass.instanceof()
,选择一个子集,
selectClass
将是一个类似于
Apple.class
的参数)

如果您认为苹果是具有特定行为的水果,您可以将其添加为接口(例如,
类apple Extended fruit实现了水果身份
)。但是不同水果的列表仍然与
水果类将描述的“如何成为水果”是分开的


这有意义吗?

一个真正的问题,你应该有一个好的答案,并且应该在你的帖子中:为什么你的苹果类需要访问整个水果列表?Fruit类应该做的是,它可能会尝试对该列表执行的任何操作,我正在编写minecraft插件,我有一个类,它只注册了一堆类,也把它放在了EnumMap中,我还需要在其他类的映射中包含这些内容,因为其中的每个对象都包含了所需的信息,但我不需要注册类中的所有其他内容,只是映射,但是扩展类似乎比通过大量的类注入类要简单得多。简言之,我只需要映射,因为它包含信息,或者是Mike建议的所有类的实例,或者是水果类的一部分。或者说,你需要一个混合水果列表以及一个aple对象来执行特定的操作,然后它应该在单独的类中完成,比如说“水果混合器”,它不应该继承水果,但可以在方法中接受混合水果列表和苹果引用。类似于使用compactor而不是Comparable更多的讨论和相关文章的链接:我理解你的意思,我同意,但我认为我给出的例子只是一个坏例子。我真的只想得到一些其他类在另一个类中必须使用的变量或东西。我有一个类,我只是创建了一组特定类的实例,这些实例都实现了某个接口。我只需要访问另一个类中的实例列表。扩展这个类似乎是最直接的方法。我希望你能理解。如果你想让我具体点,我有一个叫做PerkManager的类,我只需要为实现Perk的每个类创建一个实例,它将所有类都放在一个enummap中,enum Perks作为键,Perk实例作为值。现在我需要把这个enummap放到所有其他类中,在这些类中我需要这个map,它包含这些类的实例,这些类具有perk的功能,其中包含关于perk的信息。这是我能得到的最具体的。顺便说一句,理论上我每次使用这些类时都可以创建一个新的类实例。我真的不知道你是否应该这样做,因为我只是创建了一堆相同的类实例,基本上在它被使用后会立即被垃圾收集。我猜这不太好。现在听起来你好像在尝试使用类作为实例。Java允许您存储ni类中的东西,但这不是它们的用途,它只是使它们成为全局变量,并具有所有导致这些变量的不灵活性。如果您想要一个全局变量跟踪所有对象,那么它可以是一个单例(类
getInstance()
方法可以返回),如果需要,您至少可以传递它,但最好是创建一个共享的单个对象(如果您更喜欢该术语,则可以插入依赖项)。将其设计为不可变(或具有不可变视图),以提高安全性。