Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用超类静态方法获取子类的实例

使用超类静态方法获取子类的实例
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

复制
相关文章
Erlang语言不是用来解决所有问题的语言
Erlang应用场合 未来的计算是并发计算。现今甚至桌面CPU也是多核的,当用户给服务器购买了越来越多的CPU时,他们更期望能最大限度地利用他们的新投资,但是今天的许多软件系统并不能很好地做到这一点。 整个软件行业也在发生重大变革,由卖工具软件转向卖服务(软件免费,这也是开源软件兴起的过程),由单纯客户端向B/S或C/S转化,相应的存储和计 算向服务器端转移,由原来的PC客户端向客户端多元化(如手机、PDA、电视机顶盒等)转化。这些变革趋势,使得用户可以更方便地访问到服务的同时,服务 器也要承受越来越高的负荷,并行/分布的需求逐渐增加。 Erlang语言不是用来解决所有问题的语言,至少现在还不是。Erlang最初专门为通信应用设计的,比如控制交换机或者变换协议等,非常适合于构 建分布式,实时软并行计算系统。它是一门专注的语言,可以适应现代服务器要求高负荷、高可靠、持续服务的需求。它要解决的问题域包括:高并发、分布式、持 续服务、热升级和高可靠等问题。 Erlang应用实例 典型的Erlang应用是由很多被分配不同任务的“节点(Node)”组成的“集群 (Cluster)”。一个Erlang节点就是一个Erlang虚拟机的实例,用户可以在一台机器(服务器、台式机或者笔记本)上运行多个节点。 Erlang节点自动跟踪所有连接着的其他节点。要添加一个节点仅仅需要将其指向任何一个已建节点就可以了。只要这两个节点建立了连接,所有其他节点马上 就会感应到新加入的节点。Erlang进程使用进程ID向其他进程传递报文,进程ID包含着运行此进程的节点信息。因此进程不需要理会正在与其交流的其他 进程实际在何处运行。一组相互连接的Erlang节点可以看作是一个网格计算体或者一台超级计算机。 erlang的odbc应用程序结构图 Yaws是一个Erlang写的Web服务器。ErLang本身带有一个HTTP Server,叫做inet。Yaws对于inet,就相当于Servlet对于Http Server。Yaws也可说是一个Web开发框架,Yaws的ehtml类似于jsp、 php、ruby template。Yaws并发能力是Apache的15倍,有人利用16台集群服务器所做的显示,Yaws可以承受超八万并发活动,Apache在四千 就宕机了。 erlang和ruby的简单测试 Ejabberd也是Erlang很好的应用实例,也是目前可扩展性最好的一种 Jabber/XMPP服务器,支持分布多个服务器,并且具有容错处理,单台服务器失效不影响整个集群运作。Ejabberd基于ErLang+ Mnesia构建,项目已成功发展5年,占据30%左右Jabber服务器市场。 Tsung则是多协议分布式压力测试工具,可用于测试Http、Soap、Postgresql和Jabber/XMPP服务器。而Wings则是一个3D建模程序,软件支持Windows、Mac OSX和Linux等操作系统,这两个项目都基于Erlang构建。 Erlang将会成为一个非常重要的语言。如果有了大公司的支持,它甚至可能成为下一个Java。因为它是个开源项目,非常适合多核处理、Web服务等领域。事实上,它也是编写在多核机器上运行的高可靠性系统的唯一成熟语言。 Erlang始于20年前,是一个并发性Prolog,Joe Armstrong创造了它。第一个大型Erlang项目是一个由几百人创建的电信交换系统,系统有数百万行代码。系统主要关注的就是可靠性,并且系统有 难以置信的可靠性历史。据Joe介绍,“它有99.9999999%的可靠性”。 这意味着每10亿秒才有1秒宕机时间,或者说10亿分钟有1分钟宕机时间。十亿秒大概是30年,10亿分钟大概有2000年。99.999% 的可靠性大概是每年宕机5分钟,这已经是很好的了。了解可靠性的人都知道,可靠性系统有 99.9999%的,甚至99.99999%的,但是估计没听过有99.9999999%可靠性的,可基于Erlang的系统实现了。 但这还不是令Erlang壮大的理由,因为不是什么人都关注可靠性。也不是因为 Erlang是一个函数式语言,更不是并行Erlang是个面向对象语言。其发展迅速的主要原因是唯一一个有可靠实现和完善类库的成熟的并行开发语言,在 不久的将来所有的桌面系统、笔记本电脑都将是多核的,而要让程序在多核上更快的运行就要使程序能充分利用多核处理的能力。 Erlang带有一组类库。多数类库是用于构建各类Internet服务的。 Erlang有Web服务器和数据库。Erlang社区认为它是构建可靠Web服务器和Web服务的首选语言。Erlang是一个构建可靠系统的框架/平 台,它构建的平台可以持续运行而无需关闭,可以每天更新软件,甚至可以定期的更换硬件。这些特性是电信应用所需要的,它还是在线银行、
用户7705674
2021/10/06
1.1K0
在Windows上运行单节点的Cassandra
Cassandra可以安裝在很多系统上, 我是安装在windows server 2008 R2上,安装相当简单,只要把下载下来的压缩包解压缩放到一个目录下就可以了,这里主要是记录下使用体验: Cassandra官网: http://cassandra.apache.org/,下载页面 http://cassandra.apache.org/download/ Cassandra用java开发的,要求安装JVM 1.6以上,推荐 Version 6 Update 23  到Java官网下载 http://w
张善友
2018/01/19
2.4K0
在Windows上运行单节点的Cassandra
在 Ubuntu Linux 上安装最新的 Erlang
Erlang 在 Ubuntu 的 Universe 仓库 中可用。启用该仓库后,你可以使用下面的命令轻松安装它:
用户8965210
2021/09/27
2.9K0
Elixir: 编程语言的未来
这篇文章谈一谈最近火爆的 Elixir,同时说一下对编程语言选择的看法。同时作为 Erlang 发烧友,Elixir 不可不提。即使有了那么多编程语言 Elixir 也值得接触。本文主要分为以下四块内
时见疏星
2018/06/01
3K0
Erlang 01 - 子进程规范
子进程规范是一个用于描述监督者管理的进程的元组. 对于大多数监督者而言, 子进程会随监督者的启动而启动, 并在监督者的生命周期结束时退出. 对于单个需要监督的进程, init/1函数给出的描述如下:
Reck Zhang
2021/08/11
1.1K0
在较小内存的机器上运行Elasticsearch与Kibana
因为穷,只买得起1G内存的乞丐配置版的云服务器,但是又想玩玩Elasticsearch+Kibana。而Elasticsearch默认的heap size就是1G,很容易卡死,因此需要手动修改一下配置。
dandelion1990
2019/07/16
5.2K0
[答疑]人翻书,翻书的操作是在人上还是书上
我有个问题,有个类书,一个类人,现在人想翻书,那么翻这个方法是放在书的类上,还是人的类上
用户6288414
2019/09/23
7280
[答疑]人翻书,翻书的操作是在人上还是书上
Struts2的Action是单例还是多例 / SpringMVC的controller默认是单例还是多例?
根据文章,Struts2的Action是单例模式,而SpringMVC的Controller默认是单例模式。单例模式可以提高SpringMVC性能,不需要每次相应请求都创建一个对象。然而,在特殊情况下,需要在Controller类定义属性时,单例肯定会出现竞争访问,需要将单例改为多例模式。在Spring整合Struts2开发时,如果需要用使用Struts2多例,就在spring的action bean配置的时候设置scope=\"prototype\"。
程裕强
2018/01/02
1.9K0
Ruby vs Elixir | 2022 该选哪个?
Ruby 和 Ruby on Rails 可能并不需要过多的介绍,因为它们已经被广泛的应用在 Web 开发领域。
RiemannHypothesis
2022/09/28
1.7K0
工业互联网爆火的背后,是顺势而为还是逆流而上?
工业互联网是互联网和新一代信息技术在工业全领域、全产业链、全价值链中的融合集成应用,是实现工业智能化的综合信息基础设施。
SDNLAB
2020/04/16
4520
这有“三高一快零故障”网络架构实践,还有掉坑逃生指南
内容来源:2017 年 11 月 04 日,中兴高级系统架构师魏猷君在“2017厦门软件技术峰会”进行《高可靠性网络架构实践》演讲分享。IT 大咖说(微信id:itdakashuo)作为独家视频合作方,经主办方和讲者审阅授权发布。
IT大咖说
2018/07/30
7810
这有“三高一快零故障”网络架构实践,还有掉坑逃生指南
View Merge 在安全控制上的变化,是 BUG 还是增强 ?
什么是 View Merge View Merge 是 12C 引入的新特性,也是一种优化手段。当查询中引用了 View 或 inline view 时,优化器可以将主查询中的查询条件并入视图当中去进行优化选择以获得代价最小的执行计划。而如果视图不属于当前执行语句的用户,View Merge 就可能存在潜在 OPTIMIZER_SECURE_VIEW_MERGING(默认是 TRUE)控制。当执行语句的用户缺乏对视图的 MERGE VIEW 权限,也没有 MERGE ANY VIEW 权限时,是否允许优化器
数据和云
2018/03/29
7620
检查高 CPU 进程在 Linux 上运行时间的脚本
给 long-running-cpu-proc.sh 设置可执行的 Linux 文件权限。
用户4988085
2021/09/15
2.2K0
View Merge 在安全控制上的变化,是 BUG 还是增强 ?
View Merge 是 12C 引入的新特性,也是一种优化手段。当查询中引用了 View 或 inline view 时,优化器可以将主查询中的查询条件并入视图当中去进行优化选择以获得代价最小的执行计划。而如果视图不属于当前执行语句的用户,View Merge 就可能存在潜在 OPTIMIZER_SECURE_VIEW_MERGING(默认是 TRUE)控制。当执行语句的用户缺乏对视图的 MERGE VIEW 权限,也没有 MERGE ANY VIEW 权限时,是否允许优化器进行 View Merge 优化。
数据和云01
2019/05/26
5550
在一台机器上配置 redis 哨兵模式
最后要检查服务器防火墙有没有开放这些端口 6379, 6380, 6381, 26379, 26380, 26381
北漂的我
2021/01/18
1.6K0
Erlang设计原则Behaviour
ChildSpec参数{Id, StartFunc, Restart, Shutdown, Type, Modules}
职场亮哥
2020/10/10
7650
数据中台是真火还是炒作?
马云老师在2019年说了一段话,“很多人会把数据比作石油,我们现在搭建的数据中台,就是希望扮演发电厂的角色”,这一段话,现在被大众认为是“数据中台”这个概念的起源。
凯哥
2020/01/17
8600
数据中台是真火还是炒作?
从 10 Gb 到 40 Gb,从百万级到千万级转发,打造高性能 TGW
腾讯架构师
2017/09/08
6.5K1
从 10 Gb 到 40 Gb,从百万级到千万级转发,打造高性能 TGW
小程序可以打破平台限制在硬件设备上运行吗?
在小程序技术日益成熟、生态日益善的前景下,运营者们发现小程序“即用即走、轻量开发”的特点非常契合各种硬件设备的使用场景;开发者们对“一次开发,多端运行”的诉求也变得越来越强烈。
用户10245619
2023/01/11
7790
用 abstract unix socket 实现进程单实例运行
http://stackoverflow.com/questions/2964391/preventing-multiple-process-instances-on-linux
byronhe
2021/06/25
1.3K0

相似问题

如何根据类的基数对个体进行分类

14

如何在excel中根据条件对值进行分类

10

如何根据某一条件对组进行小计

22

根据条件对特定行数进行平均

12

根据其他数据集的条件对变量进行分类

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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