View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.collections4;
18  
19  import org.apache.commons.collections4.functors.ConstantFactory;
20  import org.apache.commons.collections4.functors.ExceptionFactory;
21  import org.apache.commons.collections4.functors.InstantiateFactory;
22  import org.apache.commons.collections4.functors.PrototypeFactory;
23  
24  /**
25   * {@code FactoryUtils} provides reference implementations and utilities
26   * for the Factory functor interface. The supplied factories are:
27   * <ul>
28   * <li>Prototype - clones a specified object
29   * <li>Instantiate - creates objects using reflection
30   * <li>Constant - always returns the same object
31   * <li>Null - always returns null
32   * <li>Exception - always throws an exception
33   * </ul>
34   * <p>
35   * Since v4.1 only factories which are considered to be safe are
36   * Serializable. Factories considered to be unsafe for serialization are:
37   * </p>
38   * <ul>
39   * <li>Prototype
40   * <li>Instantiate
41   * </ul>
42   *
43   * @since 3.0
44   */
45  public class FactoryUtils {
46  
47      /**
48       * Creates a Factory that will return the same object each time the factory
49       * is used. No check is made that the object is immutable. In general, only
50       * immutable objects should use the constant factory. Mutable objects should
51       * use the prototype factory.
52       *
53       * @see org.apache.commons.collections4.functors.ConstantFactory
54       * @param <T> the type that the factory creates
55       * @param constantToReturn  the constant object to return each time in the factory
56       * @return the {@code constant} factory.
57       */
58      public static <T> Factory<T> constantFactory(final T constantToReturn) {
59          return ConstantFactory.constantFactory(constantToReturn);
60      }
61  
62      /**
63       * Gets a Factory that always throws an exception.
64       * This could be useful during testing as a placeholder.
65       *
66       * @see org.apache.commons.collections4.functors.ExceptionFactory
67       * @param <T> the type that the factory creates
68       * @return the factory
69       */
70      public static <T> Factory<T> exceptionFactory() {
71          return ExceptionFactory.<T>exceptionFactory();
72      }
73  
74      /**
75       * Creates a Factory that can create objects of a specific type using
76       * a no-args constructor.
77       *
78       * @see org.apache.commons.collections4.functors.InstantiateFactory
79       * @param <T> the type that the factory creates
80       * @param classToInstantiate  the Class to instantiate each time in the factory
81       * @return the {@code reflection} factory
82       * @throws NullPointerException if the classToInstantiate is null
83       */
84      public static <T> Factory<T> instantiateFactory(final Class<T> classToInstantiate) {
85          return InstantiateFactory.instantiateFactory(classToInstantiate, null, null);
86      }
87  
88      /**
89       * Creates a Factory that can create objects of a specific type using
90       * the arguments specified to this method.
91       *
92       * @see org.apache.commons.collections4.functors.InstantiateFactory
93       * @param <T> the type that the factory creates
94       * @param classToInstantiate  the Class to instantiate each time in the factory
95       * @param paramTypes  parameter types for the constructor, can be null
96       * @param args  the arguments to pass to the constructor, can be null
97       * @return the {@code reflection} factory
98       * @throws NullPointerException if the classToInstantiate is null
99       * @throws IllegalArgumentException if the paramTypes and args don't match
100      * @throws IllegalArgumentException if the constructor doesn't exist
101      */
102     public static <T> Factory<T> instantiateFactory(final Class<T> classToInstantiate, final Class<?>[] paramTypes,
103                                                     final Object[] args) {
104         return InstantiateFactory.instantiateFactory(classToInstantiate, paramTypes, args);
105     }
106 
107     /**
108      * Gets a Factory that will return null each time the factory is used.
109      * This could be useful during testing as a placeholder.
110      *
111      * @see org.apache.commons.collections4.functors.ConstantFactory
112      * @param <T> the "type" of null object the factory should return.
113      * @return the factory
114      */
115     public static <T> Factory<T> nullFactory() {
116         return ConstantFactory.<T>constantFactory(null);
117     }
118 
119     /**
120      * Creates a Factory that will return a clone of the same prototype object
121      * each time the factory is used. The prototype will be cloned using one of these
122      * techniques (in order):
123      *
124      * <ul>
125      * <li>public clone method</li>
126      * <li>public copy constructor</li>
127      * <li>serialization clone</li>
128      * </ul>
129      *
130      * @see org.apache.commons.collections4.functors.PrototypeFactory
131      * @param <T> the type that the factory creates
132      * @param prototype  the object to clone each time in the factory
133      * @return the {@code prototype} factory, or a {@link ConstantFactory#NULL_INSTANCE} if
134      * the {@code prototype} is {@code null}
135      * @throws IllegalArgumentException if the prototype cannot be cloned
136      */
137     public static <T> Factory<T> prototypeFactory(final T prototype) {
138         return PrototypeFactory.<T>prototypeFactory(prototype);
139     }
140 
141     /**
142      * Don't allow instances.
143      */
144     private FactoryUtils() {
145         // empty
146     }
147 
148 }