java - 在接口 VS 中定义的匿名类。接口外的具体类
问题描述
在某些情况下,例如在策略模式中,我必须提供一些接口的默认类。
在这种情况下,我通常在不同的 java 文件中创建一个具体的接口类,如下所示。
public interface MyStrategy {
void doSomething();
}
public class DefaultMyStrategy implements MyStrategy {
@Override
public void doSomething() {
}
}
但最近,我看到一些代码在接口中包含一个匿名类,如下所示。
public interface MyStrategy {
MyStrategy DEFAULT = new MyStrategy() {
@Override
public void doSomething() {
}
};
void doSomething();
}
哪个更适合制作默认课程?
在我看来,MyStrategy strategy = MyStrategy.DEFAULT;
比MyStrategy strategy = new DefaultMyStrategy();
.
但是,我想知道第二个是否被广泛使用。
解决方案
这实际上取决于您的用例。在第二种情况下,您将获得以下行为。
默认情况下
MyStrategy DEFAULT
将是public static final
. 这意味着你不能reinitialize
在任何时候。将
same reference
在您使用的地方共享MyStrategy.DEFAULT
。如果对象是mutable
并且您是,mutating
那么您可能会遇到一些问题。该对象将在第一次使用时创建,
not be eligible for GC
直到类加载器卸载该类。
但是在这种情况下,MyStrategy strategy = new DefaultMyStrategy();
您每次使用new DefaultMyStrategy();
.
现在用例在您手中。
推荐阅读
- entity-framework - 使用实体框架和存储库模式在 SQLite 和 SQL Server 数据库中同时进行数据操作
- matlab - 使用 uisetcolor 的颜色选择器 - Matlab
- arm - STM32F207 裸机 SPI RXNE 和 TXE 不工作?
- mysql - MySQL如何在带有列名的where语句中搜索JSON数组或JSON_CONTAINS
- php - 在 php 中执行两个不同的日期
- selenium - 如何将 Specflow 场景大纲示例数据获取到表中
- python - 比较两个数据框的列并使用 Pandas 返回不同列的值
- python - Urwid raise (maxcol,) = 解压的值太多
- android - 此组件的样式要求您的应用主题为 Theme.AppCompat(或后代):BottomNavigationView
- xml - 限制值以在肥皂网络服务中发送