Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!gegeweb.org!newsfeed.kamp.net!newsfeed.kamp.net!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Robert Klemme Newsgroups: comp.lang.java.programmer Subject: Re: Class.forName().newInstance() vs new Date: Sat, 11 Jun 2011 19:49:08 +0200 Lines: 53 Message-ID: <95ho4qFd7cU1@mid.individual.net> References: Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Trace: individual.net ZMVtYVcuUmiJt5ABvZfpTwbocRyoPijeNnjFa7wFGzbE02298= Cancel-Lock: sha1:/7uzTPCaEXM0OltCXIF1SHnFPbI= User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.2.17) Gecko/20110414 Lightning/1.0b2 Thunderbird/3.1.10 In-Reply-To: Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:5208 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.). Doing if else cascades is certainly the worst thing - not so much because of the performance but because of the deficiency that you need to touch the code every time you want to add a new class. With the other two approaches you do not have to do that. Kind regards robert -- remember.guy do |as, often| as.you_can - without end http://blog.rubybestpractices.com/