将抽象类放在包含其派生类的同一包中是一种不好的编程习惯吗?

Joh*_*ith 8 java abstract-class derived-class package

假设 A、B、C 派生自 AbstractBaseClass,并且它们都是同一个 java 项目的一部分,是以下形式的包结构...

 package com.whatever.###
 AbstractBaseClass.java

 package com.whatever.###.###
 A.java
 B.java
 C.java
Run Code Online (Sandbox Code Playgroud)

...通常优于以下形式的封装结构...

 package com.whatever.###.###
 AbstractBaseClass.java
 A.java
 B.java
 C.java
Run Code Online (Sandbox Code Playgroud)

...或者很少有人会关心?

Jas*_*ske 1

我使用第一个示例编写了一个相当复杂的应用程序,以下是我如何证明设计的合理性。就我而言,有一个与承保案例定价相关的通用界面,但有几个供应商可以提供不同的 Web 服务来填充实际数据。这是包结构

com.example.pricing
 \IPricingProvider.java
 \AbstractPriceProvider.java
com.example.pricing.vendorA
   \PricingEngine.java
com.example.pricing.vendorB
   \PricingEngine.java
com.example.pricing.vendorC
   \PricingEngine.java
Run Code Online (Sandbox Code Playgroud)

然后在我的代码中,我使用 来import连接我想要的引擎。像这样:

import com.example.pricing.*;
import com.example.pricing.vendorB.*;

IPricingProvider provider = Engine.create();
Run Code Online (Sandbox Code Playgroud)

对我来说,优点是能够为每个供应商提供复杂而混乱的实现(其中两个是基于 REST 的,一个是使用 Web 服务,wsimport因此会生成大量 Java 文件),并且不会使 Eclipse 自动完成看起来像一场噩梦。它还使得将单个供应商移交给不同的开发人员变得更容易。

  • 我不同意你的回答,因为对我来说,在不同的包中使用相同的类名是一场噩梦。我更喜欢相同的包和不同的类名。我只是将不同的实现打包到不同的 jar 中(如果可能),并且只包含实际使用的供应商 jar。但我认为这就像更喜欢巧克力而不是香草一样。 (2认同)