/* 
 | 
 * Copyright (C) 2008 Google Inc. 
 | 
 * 
 | 
 * Licensed 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 cn.emay.sdk.util.json.gson; 
 | 
  
 | 
import java.lang.reflect.Type; 
 | 
  
 | 
/** 
 | 
 * This interface is implemented to create instances of a class that does not 
 | 
 * define a no-args constructor. If you can modify the class, you should instead 
 | 
 * add a private, or public no-args constructor. However, that is not possible 
 | 
 * for library classes, such as JDK classes, or a third-party library that you 
 | 
 * do not have source-code of. In such cases, you should define an instance 
 | 
 * creator for the class. Implementations of this interface should be registered 
 | 
 * with {@link GsonBuilder#registerTypeAdapter(Type, Object)} method before Gson 
 | 
 * will be able to use them. 
 | 
 * <p> 
 | 
 * Let us look at an example where defining an InstanceCreator might be useful. 
 | 
 * The {@code Id} class defined below does not have a default no-args 
 | 
 * constructor. 
 | 
 * </p> 
 | 
 * 
 | 
 * <pre> 
 | 
 * public class Id<T> { 
 | 
 *     private final Class<T> clazz; 
 | 
 *     private final long value; 
 | 
 *  
 | 
 *     public Id(Class<T> clazz, long value) { 
 | 
 *         this.clazz = clazz; 
 | 
 *         this.value = value; 
 | 
 *     } 
 | 
 * } 
 | 
 * </pre> 
 | 
 * 
 | 
 * <p> 
 | 
 * If Gson encounters an object of type {@code Id} during deserialization, it 
 | 
 * will throw an exception. The easiest way to solve this problem will be to add 
 | 
 * a (public or private) no-args constructor as follows: 
 | 
 * </p> 
 | 
 * 
 | 
 * <pre> 
 | 
 * private Id() { 
 | 
 *     this(Object.class, 0L); 
 | 
 * } 
 | 
 * </pre> 
 | 
 * 
 | 
 * <p> 
 | 
 * However, let us assume that the developer does not have access to the 
 | 
 * source-code of the {@code Id} class, or does not want to define a no-args 
 | 
 * constructor for it. The developer can solve this problem by defining an 
 | 
 * {@code InstanceCreator} for {@code Id}: 
 | 
 * </p> 
 | 
 * 
 | 
 * <pre> 
 | 
 * class IdInstanceCreator implements InstanceCreator<Id> { 
 | 
 *     public Id createInstance(Type type) { 
 | 
 *         return new Id(Object.class, 0L); 
 | 
 *     } 
 | 
 * } 
 | 
 * </pre> 
 | 
 * 
 | 
 * <p> 
 | 
 * Note that it does not matter what the fields of the created instance contain 
 | 
 * since Gson will overwrite them with the deserialized values specified in 
 | 
 * Json. You should also ensure that a <i>new</i> object is returned, not a 
 | 
 * common object since its fields will be overwritten. The developer will need 
 | 
 * to register {@code IdInstanceCreator} with Gson as follows: 
 | 
 * </p> 
 | 
 * 
 | 
 * <pre> 
 | 
 * Gson gson = new GsonBuilder().registerTypeAdapter(Id.class, new IdInstanceCreator()).create(); 
 | 
 * </pre> 
 | 
 * 
 | 
 * @param <T> 
 | 
 *            the type of object that will be created by this implementation. 
 | 
 * 
 | 
 * @author Inderjeet Singh 
 | 
 * @author Joel Leitch 
 | 
 */ 
 | 
public interface InstanceCreator<T> { 
 | 
  
 | 
    /** 
 | 
     * Gson invokes this call-back method during deserialization to create an 
 | 
     * instance of the specified type. The fields of the returned instance are 
 | 
     * overwritten with the data present in the Json. Since the prior contents of 
 | 
     * the object are destroyed and overwritten, do not return an instance that is 
 | 
     * useful elsewhere. In particular, do not return a common instance, always use 
 | 
     * {@code new} to create a new instance. 
 | 
     * 
 | 
     * @param type 
 | 
     *            the parameterized T represented as a {@link Type}. 
 | 
     * @return a default object instance of type T. 
 | 
     */ 
 | 
    public T createInstance(Type type); 
 | 
} 
 |