使用超类静态方法获取子类的实例

2024-01-08

我有一个超类,我想转发一个名为的静态方法getInstance()到所有子类。

创建子类的实例时,我然后在超类中注册该实例(可能使用哈希表,其中键基于getClass())。然后,我希望使用前面提到的静态方法(getInstance) 其中超类方法将返回正确类型的实例。

例如,我有一个超类 A,子类 B 扩展了 A。 我想写一个静态方法A.getInstance();当从 B 调用时(B.getInstance()),我希望它返回我之前存储的 B 实例。

这有点难以解释,但我将大量使用这个超类,而且我宁愿不编写getInstance方法到每个子类中。

我该如何去做这样的事情呢?

编辑:我刚刚意识到我的问题可能被误解为创建对象的新实例。我已经创建了实例,并且我希望获取该类的现有实例


正如许多其他人在评论中指出的那样,您尝试做的事情是静态方法不可能实现的。另外,您应该尽可能避免静态方法,因为它们可能会导致测试和维护噩梦 (*)。

你将你的方法命名为“getInstance”,所以我guess你想要做的是工厂模式和单例模式的混合。以下是一些可帮助您开始了解这些模式的信息:

单例:http://en.wikipedia.org/wiki/Singleton_pattern http://en.wikipedia.org/wiki/Singleton_pattern
工厂方法:http://en.wikipedia.org/wiki/Factory_method_pattern http://en.wikipedia.org/wiki/Factory_method_pattern
抽象工厂:http://en.wikipedia.org/wiki/Abstract_factory http://en.wikipedia.org/wiki/Abstract_factory

如今,两者都不应该手动编码 (*) - 看看一个好的“依赖注入”(DI) 容器,如 Google Guice 或 Spring。我不是 100% 确定你到底想要实现什么,但看起来 DI 容器会为你做到这一点。

Edit:这是对问题编辑的回应。您想要接收子类的缓存实例。在这种情况下,我仍然建议不要使用静态方法。您可以创建“BCache”类的单例实例(使用 DI 容器或手动对其进行编程),然后使用此缓存对象来查找已注册的对象。使用 Guice 作为 DI 容器,它可能看起来像这样(警告,未经测试):

@Singleton
public class BCache {
    private Map<Class<? extends B>, B> cache = ...;

    public <T> T getInstance(Class<? extends T> type) {
        return (T) cache.get(type);
    }
}

不过,我仍然认为使用 DI 容器完全摆脱缓存类是可能的。同样,这是未经测试的代码,使用 Guice,但它可能如下所示:

@Singleton
public class A extends B {
    public A() {
        //I am not sure if you need to register in this case, because your
        //DI container keeps track of the singleton instances.
        super.register(this);
    }
}

public class SomeClassUsingA {
    @Inject private A a;
}

(*) 请注意“所有概括都是错误的”,也就是说,在某些项目中它可能有意义,但在大多数项目中则不然。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用超类静态方法获取子类的实例 的相关文章

  • 正确配置JDK环境变量后仍然找不到java命令

    我在 Windows 虚拟机启动时安装 JDK 使用 cloudinit 用户数据将 PowerShell 脚本传输到 Windows 计算机 然后运行该脚本来安装 JDK softwares Get ItemProperty HKLM S
  • Java - 从配置文件加密/解密用户名和密码

    我们正忙于为客户开发 Java Web 服务 有两种可能的选择 将加密的用户名 密码存储在Web服务客户端上 从配置中读取 文件在客户端 解密并发送 将加密的用户名 密码存储在 Web 服务器上 从配置中读取 Web 服务器上的文件 解密并
  • 如何使用 Java 创建多个模式连接?

    我必须使用两个数据库 DB2 Oracle 我在 DB2 数据库中有一个名为NAVID 我想使用 Java 为 Oracle 中的所有表创建相同的架构 public class automateExport static String va
  • Java中定义类型后同时初始化多个变量?

    这里需要一些语法方面的帮助 我正在尝试在定义类型后重新初始化多个变量 例如 int bonus sales x y 50 这工作正常 但是我想稍后在程序中将不同的值放入其中一些变量中 但我收到语法错误 bonus 25 x 38 sales
  • 在哈希图中存储字符和二进制数

    我正在尝试存储字母到二进制数的映射 这是我的映射 h 001 i 010 k 011 l 100 r 101 s 110 t 111 为此 我创建了一个哈希映射并存储了键值对 我现在想显示给定句子的相应二进制值 这是我的代码 package
  • 如何在数据库中对 (Java) 枚举进行建模(使用 SQL92)

    您好 我正在使用名为 性别 的列对实体进行建模 在应用程序代码中 性别应该是一个 Java 枚举类型 有 2 个值 男性和女性 知道作为数据类型的枚举不是通用 SQL 语言 92 的一部分 您将如何建模它 数据模型必须是可移植的 以便由多个
  • 动画图像视图

    目前我正在开发一款游戏 这是我的游戏的详细信息 用户应选择正确的图像对象 我希望图像从左到右加速 当他们到达终点时 他们应该再次出现在活动中 这是我正在处理的屏幕截图 我有 5 个图像视图 它们应该会加速 您有此类动画的示例代码吗 非常感谢
  • Codility 钉板

    尝试了解 Codility NailingPlanks 的解决方案 问题链接 https app codility com programmers lessons 14 binary search algorithm nailing pla
  • 更改 JTextPane 的大小

    我是Java新手 刚刚在StackOverflow中找到了这段代码 ResizeTextArea https stackoverflow com questions 9370561 enabling scroll bars when jte
  • 无法在 Mac OS X 上启动应用程序 我收到错误 LSOpenURLsWithRole() 应用程序失败,错误为 -10810

    问题 我正在尝试启动一个应用程序 遗传网络分析仪 http www genostar com category products gna 但它默默地失败了 使用时open gna app产生以下错误消息 LSOpenURLsWithRole
  • 如何将txt文件添加到你的android项目中? [复制]

    这个问题在这里已经有答案了 我的Android studio版本是1 5 1 显然这个 never 版本没有 txt 文件的 asset 文件夹 您打算如何将这些文件包含到您的项目中 以及如何进一步使用您内部的应用程序 谢谢你的建议 Pro
  • 更改 RowLayout SWT Java 中元素的顺序

    有没有办法更改在行布局中创建的元素的顺序 我想将其显示在元素中 首先显示 例如 如果我创建 element1 则 element2 element3 element4 我想看到的布局为 元素4 元素3 元素2 元素1 这意味着最后创建的元素
  • Java 类:匿名类、嵌套类、私有类

    有人能解释一下Java中匿名类 嵌套类和私有类之间的区别吗 我想知道与每个相关的运行时成本以及每个编译器的方法 这样我就可以掌握哪个最适合用于例如性能 编译器优化的潜力 内存使用以及其他 Java 编码人员的普遍可接受性 我所说的匿名类是指
  • 在多模块项目中访问绑定适配器

    我有一个多模块项目 其中应用程序模块包含我的绑定适配器 而我的功能模块取决于我的应用程序模块 因为它是动态功能模块 应用程序 包含绑定适配器 gt 动态功能模块 存在布局的地方 我在所有模块中启用了数据绑定和 kapt 我无法成功构建应用程
  • setKeyListener 将覆盖 setInputType 并更改键盘

    大家好 我在两个设备之间遇到问题 在实践中使用InputType和KeyListener我正在操纵一个EditText让它从数字键盘接收逗号和数字 有关更多背景信息 请检查我之前的question https stackoverflow c
  • 使用 Cucumber Scenario Outline 处理 Excel 电子表格

    如果可能的话 我试图找到一种更优雅的方法来处理从与 Excel 电子表格行 第 n 个 相关的 Cucumber Scenario Outline 中调用第 n 个数字 目前 我正在使用迭代编号来定义要从中提取数据的 Excel 电子表格的
  • java数据结构模拟数据树

    我需要帮助定义使用什么方法 我有一个 SOAP 响应 给我一个 xml 文件 我需要在屏幕上显示 3 个相关列表 当您在第一个列表中选择一个项目时 相应的选择将出现在第二个列表中 依此类推 我只对从 xml 流中提取数据后如何有效地组织数据
  • 在多线程环境中,Collections.sort 方法有时会抛出 ConcurrentModificationException。列表没有进行结构性修改

    package CollectionsTS import java util ArrayList import java util Collections import java util HashSet import java util
  • 编译时在代码中替换Java静态最终值?

    在java中 假设我有以下内容 fileA java class A public static final int SIZE 100 然后在另一个文件中我使用这个值 fileB java import A class b Object t
  • RecyclerView 不调用 onCreateViewHolder 或 onBindView

    没有收到任何错误 所有数据似乎都有效 由于某种原因 没有调用与视图相关的方法 我已确定以下事项 getItemCount 是唯一被调用的适配器方法 并且返回一个正整数值 我知道这将是你们将要查看的区域 构造函数正在被调用 成员变量有效 Pa

随机推荐

  • 无法创建 IBAction ctrl-drag UIButton 到 ViewController(Xcode 版本 7.2)

    在我创建应用程序的过程中 xcode 不再允许我按住 Ctrl 键并将 UIButton 拖动到 VC 来创建 IBAction 每个 VC 都会发生这种情况 总共九个 不过 它确实允许创建 Outlet 请查看图片 gt 没有显示任何操作
  • 如何将DataTemplate数据类型绑定到接口?

    我正在编写一个复合松散耦合的 MVVM WPF 应用程序 父 VM 中的子 VM 是接口而不是类实例 例如 public IChildViewModel get set 现在如何使用 DataTemplate 呈现此属性 喜欢
  • 等宽的垂直按钮

    这是两个垂直排列的按钮 我需要它们的宽度相等 我不知道 包装的尺寸是多少 按钮上将显示什么文本 因此我不能使用像素宽度 按钮的宽度是多少 按钮必须位于左侧 按钮上的文本必须居中对齐 我不能使用 100 宽度 因为它不美观 我无法使用 Fle
  • 居委会集体——减少运营

    我需要 allreduce MPI Ineighbor allreduce 来进行 MPI 中的集体通信 遗憾的是它尚未包含在内 明显但效率不高的解决方案是使用 MPI Neighbor alltoall 以增加缓冲区大小为代价 您有什么建
  • 如何在不刷新页面的情况下“连续”更改背景颜色[重复]

    这个问题在这里已经有答案了 有没有办法像彩虹一样不断改变背景颜色 希望你需要这样的东西 var body body var colors red green blue yellow pink purple var currentIndex
  • CSS 溢出原理

    Mozilla 对 overflow 属性的描述 将一个轴设置为可见 默认 同时将另一个轴设置为不同的值会导致可见行为为自动 我看不出这样做有任何好处 也看不到由此可以避免的任何问题 为什么是规范的这一部分 考虑这个例子 我们在两个方向上都
  • 如何减去 IEEE 754 数字?

    如何减去 IEEE 754 数字 例如 0 546875 32 875 gt 0 546875 是 IEEE 754 中的 0 01111110 10001100000000000000000 gt 32 875 在 IEEE 754 中是
  • 在外部单击时如何使用和关闭 PopupWindow?

    我目前正在使用以下方法设计简单的提示弹出窗口弹出窗口 http developer android com reference android widget PopupWindow html班级 当在内容之外单击时 我可以关闭弹出窗口 然而
  • 如何更改两个字段中的默认“请填写此字段”

    我想在两个字段中显示两条不同的消息 例如 用户名和密码字段包含 用户名不能为空 和 密码不能为空 等消息 我只设法更改了消息 但两个字段的消息都是相同的 它是here http jsfiddle net Godfather 5fp4Y 4
  • Active Directory Web 服务 (ADWS) SDK

    我最近了解到 WCF 有针对 Active Directory 的 Web 服务 我认为这与 LDAP 无关 是否有任何相关文档或博客介绍默认端点是什么或 API 是什么样子 或者它是否以 SOAP 进行交流 或者您能否介绍一下如何连接到
  • 使用 wpf 4 打印的最佳方法

    你好 我需要能够从我的 wpf 应用程序进行打印 我只是想打印交易收据 我发现使用 PrintDialog pDialog new PrintDialog pDialog PrintVisual new Receipt 交易名称 我的商店
  • 有没有可能的方法将指纹生物识别设备连接到网站..?

    有没有可能的方法将指纹生物识别设备连接到网站 我创建了一个基于网络的 ERP 系统 根据客户要求 我需要集成指纹记录系统 我的网站是用 C 和 angular2 开发的 我尝试了很多 sdk 但没有任何效果符合我的预期 它唯一可行的方法是使
  • 如何在 Scrapy .csv 结果中获取双引号

    我在使用 Scrapy 的输出中遇到引用问题 我试图废弃包含逗号的数据 这会导致某些列中出现双引号 如下所示 TEST TEST TEST ON TEST TEST 2 449 000 4 735 Sq Ft 6 Bed 5 1 Bath
  • 如何使用 jest/enzyme 模拟 multer 以使用 axios 后模拟调用进行文件上传

    我正在测试我的快速路由器axios调用后到后端 我正进入 状态500响应而不是 200 不知道如何嘲笑multer有效地 对此有什么想法吗 谢谢 路线 jsx const axios require axios const router e
  • 颤动底部被无限像素溢出

    我面临这个问题 当我将某个小部件添加到列的子项中时 我不断遇到 底部溢出无限像素 的问题 现在这就是添加名为的新小部件之前的样子countdown 以下是我添加后发生的情况countdown 这是屏幕下半部分的代码 我在其中添加countd
  • Android动画中的pivotX和pivotY是什么意思? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这两个术语出现在很多地方 但它们在 Android 动画上下文中到底意味着什么 枢轴X和枢轴Y是动画的中心点 例如 如果你想做放大动画 你
  • iOS 8 Swift Xcode 6 - 设置顶部导航栏背景颜色和高度

    我到处查看并测试了 Stack 上发布的所有代码片段 但没有任何东西对我有用 因为我需要它工作 我只是想设置 导航栏高度 导航栏背景颜色 RGB 导航栏居中徽标 我正在使用 iOS8 Xcode 6 和 Swift 非常感谢您的明确答复 这
  • Tmux:如何使用选择树过滤当前会话窗口并格式化输出以显示不带主机名的窗口名称

    我想配置tmux choose tree to 仅显示我当前会话的窗口 但与此同时我想保留我当前使用的格式 不带主机名的窗口名称 我当前的设置是 bind key w choose tree F window name 看起来像这样 我发现
  • 将删除导航栏边框转换为 swift

    我正在尝试快速删除导航栏边框 这是通过在 Objective C 中使用以下代码来完成的 UINavigationBar appearance setShadowImage UIImage alloc init UINavigationBa
  • 使用超类静态方法获取子类的实例

    我有一个超类 我想转发一个名为的静态方法getInstance 到所有子类 创建子类的实例时 我然后在超类中注册该实例 可能使用哈希表 其中键基于getClass 然后 我希望使用前面提到的静态方法 getInstance 其中超类方法将返