首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用超类静态方法获取子类的实例

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

Stack Overflow用户
提问于 2013-01-16 07:54:18
回答 6查看 11K关注 0票数 3

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

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

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

这有点难以解释,但我将经常使用这个超类,并且我不希望在每个子类中都编写getInstance方法。

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

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

EN

回答 6

Stack Overflow用户

发布于 2013-01-16 08:06:01

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

您将您的方法命名为"getInstance",所以我猜您想要做的是工厂模式和单例模式的混合。下面是一些关于这些模式的入门信息:

单例:http://en.wikipedia.org/wiki/Singleton_pattern

工厂方法:http://en.wikipedia.org/wiki/Factory_method_pattern

抽象工厂:http://en.wikipedia.org/wiki/Abstract_factory

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

编辑:这是对问题编辑的响应。您希望接收子类的缓存实例。在这种情况下,我仍然建议不要使用静态方法。您可以创建"BCache“类的单例实例(使用DI容器或手动编程),然后使用此缓存对象查找已注册的对象。使用Guice作为DI容器,它可能如下所示(警告,未测试):

代码语言:javascript
运行
AI代码解释
复制
@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的未经测试的代码,但它可能如下所示:

代码语言:javascript
运行
AI代码解释
复制
@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;
}

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

票数 3
EN

Stack Overflow用户

发布于 2013-01-16 08:11:08

你不能用好的OOP方式用静态方法做你想做的事情。您可以使用反射或if .. else if束来做一些事情。

但是,您应该使用一些定义良好的设计模式,如Abstract fectoryFactory method。这就是你应该走的路,就像有人说的“不要发明温水”。

票数 1
EN

Stack Overflow用户

发布于 2013-01-16 08:18:48

您始终可以将subClass实例分配给superClass引用。因此,您的超类的静态方法可以设置或获取subClass实例。但请确保在使用之前强制转换返回的实例。

代码语言:javascript
运行
AI代码解释
复制
public class A {
    private static A a;

    /**
     * @param a the a to set
     */
    public static void setA(A a) {
        A.a = a;
    }

    /**
     * @return the a
     */
    public static A getA() {
        return a;
    }


public class B extends A {
    private int index = 0;

    /**
     * @param index the index to set
     */
    public void setIndex(int index) {
        this.index = index;
    }

    /**
     * @return the index
     */
    public int getIndex() {
        return index;
    }

用法:

代码语言:javascript
运行
AI代码解释
复制
public static void main(String[] args) throws Exception {
        B b = new B();
        A.setA(b);

    B c = (B) A.getA();
    System.out.println(c.getIndex());
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14353620

复制
相关文章
Html中的空格符
  CSS中当 white-space 属性取值为pre时,浏览器会保留文本中的空格和换行,例如:
全栈程序员站长
2022/11/09
2.2K0
HTML空格符_HTML中什么表示特殊字符空格
本篇就单介绍空格的字符实体,HTML提供了6种空格实体(space entity):
全栈程序员站长
2022/11/09
4.4K0
HTML空格符_HTML中什么表示特殊字符空格
html中的空格怎么写,html中空格代码是什么?(总结)
对于新手小白来说,html空格符号代码的书写可能有点茫然,那么本篇文章就给大家总结介绍关于html空格代码的多种表示方法。希望对大家有一定的帮助。
全栈程序员站长
2022/06/25
15.2K0
HTML中的空格字符_dw空格代码怎么打
在学习插入空格字符代码书写方法之前,我们要知道,html代码的空格字符,在浏览器中,总会被压缩为一个字符!也就是说,你在html文本中输入多个空格,但在浏览器中,只会保留显示一个字符,其余的都将被浏览器删除。
全栈程序员站长
2022/09/28
5.2K0
HTML中的空格字符_dw空格代码怎么打
html里面空格_html空格占位符
&#160; == &nbsp; == &#xA0; == no-break space (普通的英文半角空格但不换行)
全栈程序员站长
2022/11/10
5.9K0
html表格空格符是什么,HTML中的空格符号是什么
在平时我们写文章时遇到空格时都会直接输入空格键来达到空格的效果,但是在HTML代码中如果我们输入空格键就会被忽略,达不到空格的效果,今天就像大家介绍HTML中空格代码如何写,希望对大家有所帮助。
全栈程序员站长
2022/11/09
3.7K0
html表格空格符是什么,HTML中的空格符号是什么
html空格代码&nbsp_html中的转义字符
一般只要没有打错 你那应该用了flex布局 flex会影响一些语法 而且也会导致空格符实习失效 而且如果你设置了
全栈程序员站长
2022/11/09
3.9K0
html空格代码_html中空格怎么表示
html中空格代码的写法一: &nbsp (不换行空格) html中空格代码的写法二:&ensp(半角空格) html中空格代码的写法三:&emsp(全角空格) html中空格代码的写法四:&thinsp(窄空格) html中空格代码的写法五:&zwnj(零宽不连字)
全栈程序员站长
2022/11/09
6.8K0
Html的空格显示
全角空格被解释为汉字,所以不会被被解释为HTML分隔符,能够依照实际的空格数显示。
全栈程序员站长
2022/07/11
3.8K0
HTML中的4种类型空格介绍
我原本以为 HTML 中只有一种空格,就是我们常用的 &nbsp;,今天一查才知道还有另外三种,而且 &ensp; &emsp; 刚好分别是中文字符的一半和相等,在某些情况下非常有用。比如下面这种情况如果需要排列整齐的话:
Denis
2023/04/14
2.2K0
html中空格的写法[通俗易懂]
HTML不是一种编程语言,而是一种超文本标记语言 (markup language),是网页制作所必备的。超文本”就是指页面内可以包含图片、链接,甚至音乐、程序等非文字元素。 方法1:使用键盘,键入空格 在html页面中,我们可以通过键入“空格”键来插入空格。 例:在p.p1中键入一个空格,在p.p2中键入5个空格。注:此时是半角状态键入“空格”:
全栈程序员站长
2022/07/04
3.2K0
html中空格的写法[通俗易懂]
html一个汉字空格占位_html空格字符
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
2.5K0
html5空格代码怎么写_html怎么添加空格
本篇文章为大家介绍的是HTML的空格代码的写法,“&nbsp;”代码的用法,还有几种空格方式的解释,都在文章中,现在开始往下看吧。
全栈程序员站长
2022/08/02
9.5K0
html5空格代码怎么写_html怎么添加空格
正则替换 UEditor pre 中的 'nbsp' 空格 html 标签
今天在复制粘贴自己博客上的代码时发现,有的代码竟然无法执行!(pbootcms 的 if 语句)
Savalone
2020/02/11
4.1K0
正则替换 UEditor pre 中的 'nbsp' 空格 html 标签
js去掉html标签和去掉字符串文本的所有的空格
去掉html标签的js <script>  function delHtmlTag(str){   return str.replace(/<[^>]+>/g,"");//去掉所有的html标记  } var str = "<span style='display:none;'>This is test</span><img src=''>ss</img><strong></strong><br/>"; str = delHtmlTag(str); alert(str); </script> 为了一个tit
joshua317
2018/04/10
13.2K0
html空格代码是什么?html中空格怎么打「建议收藏」
html空格代码是什么?html中空格怎么打?对于刚刚入门的新手来说可能比较陌生,下面我们来总结一下html空格代码。
全栈程序员站长
2022/11/08
6.2K0
奇葩的Html空格校验问题~
在使用modal弹窗时候,关闭后导致页面无法滚动,检查后发现是body上设置了样式 overflow:hidden 导致不可滚动。
执行上下文
2022/07/26
1.5K0
奇葩的Html空格校验问题~
HTMl网页中的文本和图像
JaneYork
2023/10/11
5020
mysql查询字段中带空格的值的sql语句,并替换
(自己写的这四行)查询带有空格值的数据:SELECT * FROM 表名 WHERE 字段名 like ‘% %’;
全栈程序员站长
2022/07/11
9.9K0
html5空格代码怎么写_空格的代码是什么
本篇文章为大家介绍的是HTML的空格代码的写法,“&nbsp;”代码的用法,还有几种空格方式的解释,都在文章中,现在开始往下看吧。
全栈程序员站长
2022/11/09
6.1K0
html5空格代码怎么写_空格的代码是什么

相似问题

包含空格和固定位数的文本字段,如密码文本字段

15

文本变量中文本字段中的空格: php+html

21

为文本设置固定的空格

10

如何删除长度固定的输入字段中的空格

21

忽略文本字段中的空格

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档