Java代码样式 - 接口与抽象类

Alt*_*ape 12 java coding-style

我正在审查我编写的一些代码的一位新合作者告诉我,她不习惯看到直接在Java代码中使用的接口,例如:

public interface GeneralFoo { ... }

public class SpecificFoo implements GeneralFoo { ... }

public class UsesFoo {
     GeneralFoo foo = new SpecificFoo();
}
Run Code Online (Sandbox Code Playgroud)

相反,期待看到

public interface GeneralFoo { ... }

public abstract class AbstractFoo implements GeneralFoo { ... }

public class SpecificFoo extends AbstractFoo { ... }

public class UsesFoo {
     AbstractFoo foo = new SpecificFoo();
}
Run Code Online (Sandbox Code Playgroud)

我可以看到这个模式何时有意义,如果所有SpecificFoos通过AbstractFoo共享功能,但如果各种Foos有完全不同的内部实现(或者我们不关心特定的Foo如何做Bar,只要它这样做),直接在代码中使用接口有什么害处吗?我在某种程度上意识到这可能是一个番茄/西红柿的东西,但我很好奇第二种风格的优势,或者第一种风格的缺点,我不知道.

Mik*_*key 15

如果您不需要具有所有实现共有的某些细节的抽象类,那么就不需要抽象类.复杂性通常会添加到应用程序中,因为有些人认为需要支持尚未定义的未来功能.坚持行之有效,后来重构.

  • +1给这个.找到一个部分由抽象类实现的接口是如此常见,只有一个基类提供完全定义的功能.在成熟的代码中,这种情况要求重构以合并抽象和基类,并且可能(取决于代码结构)进一步重构以将结果接口/单个实现转换为仅一个类. (2认同)

Chr*_*röm 5

不,她没经验,不对.首选使用接口,为冗余而编写冗余抽象超类是多余的.

UsesFoo 应该关心接口指定的行为,而不是它的依赖关系的超类.