| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package org.apache.commons.collections4; |
| |
| import org.apache.commons.collections4.functors.ConstantFactory; |
| import org.apache.commons.collections4.functors.ExceptionFactory; |
| import org.apache.commons.collections4.functors.InstantiateFactory; |
| import org.apache.commons.collections4.functors.PrototypeFactory; |
| |
| /** |
| * <code>FactoryUtils</code> provides reference implementations and utilities |
| * for the Factory functor interface. The supplied factories are: |
| * <ul> |
| * <li>Prototype - clones a specified object |
| * <li>Instantiate - creates objects using reflection |
| * <li>Constant - always returns the same object |
| * <li>Null - always returns null |
| * <li>Exception - always throws an exception |
| * </ul> |
| * <p> |
| * Since v4.1 only factories which are considered to be safe are |
| * Serializable. Factories considered to be unsafe for serialization are: |
| * <ul> |
| * <li>Prototype |
| * <li>Instantiate |
| * </ul> |
| * |
| * @since 3.0 |
| * @version $Id$ |
| */ |
| public class FactoryUtils { |
| |
| /** |
| * This class is not normally instantiated. |
| */ |
| private FactoryUtils() {} |
| |
| /** |
| * Gets a Factory that always throws an exception. |
| * This could be useful during testing as a placeholder. |
| * |
| * @see org.apache.commons.collections4.functors.ExceptionFactory |
| * |
| * @param <T> the type that the factory creates |
| * @return the factory |
| */ |
| public static <T> Factory<T> exceptionFactory() { |
| return ExceptionFactory.<T>exceptionFactory(); |
| } |
| |
| /** |
| * Gets a Factory that will return null each time the factory is used. |
| * This could be useful during testing as a placeholder. |
| * |
| * @see org.apache.commons.collections4.functors.ConstantFactory |
| * @param <T> the "type" of null object the factory should return. |
| * @return the factory |
| */ |
| public static <T> Factory<T> nullFactory() { |
| return ConstantFactory.<T>constantFactory(null); |
| } |
| |
| /** |
| * Creates a Factory that will return the same object each time the factory |
| * is used. No check is made that the object is immutable. In general, only |
| * immutable objects should use the constant factory. Mutable objects should |
| * use the prototype factory. |
| * |
| * @see org.apache.commons.collections4.functors.ConstantFactory |
| * |
| * @param <T> the type that the factory creates |
| * @param constantToReturn the constant object to return each time in the factory |
| * @return the <code>constant</code> factory. |
| */ |
| public static <T> Factory<T> constantFactory(final T constantToReturn) { |
| return ConstantFactory.constantFactory(constantToReturn); |
| } |
| |
| /** |
| * Creates a Factory that will return a clone of the same prototype object |
| * each time the factory is used. The prototype will be cloned using one of these |
| * techniques (in order): |
| * <ul> |
| * <li>public clone method |
| * <li>public copy constructor |
| * <li>serialization clone |
| * <ul> |
| * |
| * @see org.apache.commons.collections4.functors.PrototypeFactory |
| * |
| * @param <T> the type that the factory creates |
| * @param prototype the object to clone each time in the factory |
| * @return the <code>prototype</code> factory, or a {@link ConstantFactory#NULL_INSTANCE} if |
| * the {@code prototype} is {@code null} |
| * @throws IllegalArgumentException if the prototype cannot be cloned |
| */ |
| public static <T> Factory<T> prototypeFactory(final T prototype) { |
| return PrototypeFactory.<T>prototypeFactory(prototype); |
| } |
| |
| /** |
| * Creates a Factory that can create objects of a specific type using |
| * a no-args constructor. |
| * |
| * @see org.apache.commons.collections4.functors.InstantiateFactory |
| * |
| * @param <T> the type that the factory creates |
| * @param classToInstantiate the Class to instantiate each time in the factory |
| * @return the <code>reflection</code> factory |
| * @throws NullPointerException if the classToInstantiate is null |
| */ |
| public static <T> Factory<T> instantiateFactory(final Class<T> classToInstantiate) { |
| return InstantiateFactory.instantiateFactory(classToInstantiate, null, null); |
| } |
| |
| /** |
| * Creates a Factory that can create objects of a specific type using |
| * the arguments specified to this method. |
| * |
| * @see org.apache.commons.collections4.functors.InstantiateFactory |
| * |
| * @param <T> the type that the factory creates |
| * @param classToInstantiate the Class to instantiate each time in the factory |
| * @param paramTypes parameter types for the constructor, can be null |
| * @param args the arguments to pass to the constructor, can be null |
| * @return the <code>reflection</code> factory |
| * @throws NullPointerException if the classToInstantiate is null |
| * @throws IllegalArgumentException if the paramTypes and args don't match |
| * @throws IllegalArgumentException if the constructor doesn't exist |
| */ |
| public static <T> Factory<T> instantiateFactory(final Class<T> classToInstantiate, final Class<?>[] paramTypes, |
| final Object[] args) { |
| return InstantiateFactory.instantiateFactory(classToInstantiate, paramTypes, args); |
| } |
| |
| } |