Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!aioe.org!.POSTED!not-for-mail From: Abu Yahya Newsgroups: comp.lang.java.programmer Subject: Re: Class.forName().newInstance() vs new Date: Sat, 11 Jun 2011 23:53:45 +0530 Organization: Aioe.org NNTP Server Lines: 47 Message-ID: References: <95ho4qFd7cU1@mid.individual.net> NNTP-Posting-Host: VXdcwsc5kgxY1YKHPVeYyQ.user.speranza.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Complaints-To: abuse@aioe.org User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.17) Gecko/20110414 Thunderbird/3.1.10 X-Notice: Filtered by postfilter v. 0.8.2 Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:5216 On 6/11/2011 11:19 PM, Robert Klemme wrote: > On 11.06.2011 19:13, Abu Yahya wrote: >> I have a class that instantiates a private member based on a value in a >> configuration file. >> >> The value is used to determine the class name. >> >> I initially decided to use code similar to the following: >> >> >> // class name comes from property file >> String dbMgrClassName = props.getProperty("db.manager"); >> Class k = Class.forName(dbMgrClassName); >> db = (DB) k.newInstance(); >> db.init(props); >> >> However, a colleague pointed out that using "new" is faster than using >> "Class.forName().newInstance()". So, I changed the code to the following: >> >> String dbMgrClassName = props.getProperty("db.manager"); >> if (dbMgrClassName.equals("DB2")) >> db = new DB2(); >> else if (dbMgrClassName.equals("Oracle")) >> db = new Oracle(); >> else if (dbMgrClassName.equals("SQLServer")) >> db = new SQLServer(); >> else { // handle unrecognized >> Class k = Class.forName(dbMgrClassName); >> db = (DB) k.newInstance(); >> } >> db.init(props); >> >> My question is: Does using if-else statements like the above really >> improve performance? What is the best approach to instantiate classes >> whose type you don't know at compile time? > > I would stick with the forName() approach. If performance is critical > then I would define an interface for the factory method and configure > the name of a class which much implement this interface. Then you need > forName() only once (for instantiating the factory instance) and can use > new in factory methods (or do even more fancy things like caching etc.). Thanks for your reply, Robert. Could you give an example of how the factory method might look like? Thanks in advance!