初始化 Gson 对象的最佳方式
Best way to init Gson object
在以下两个选项中,您更喜欢哪个选项来初始化 Gson 对象?有人可以帮助我了解这两种方式对 Android 应用性能(启动时间?)的影响,如果有的话。
// inline creation
private final Gson gson = new Gson();
对
// need base creation, overhead of sync everytime while accessing gson object
private synchronized Gson getOrCreateGson() {
gson == null ? gson = new Gson() : gson;
return gson.fromJson(jsonString, clazz);
}
好的,从你的问题来看,你问的是哪种方法更适合处理 json 数据!
然后为此我建议您 2 个选项!!
让我知道哪个最适合你!!
编码愉快!!
这取决于您,但是 private static final
来处理这件事并没有错。您可以在 related question.
阅读更多相关信息
private static final Gson gson = new Gson();
如果您的 gson 对象不是静态的,那么您不必检查 gson 是否为空。如果您确定 gson 将经常使用,则内联选项更好(无空检查)。如果 gson 使用率太低,第二个选项可能更好。很多 "if" :)
另一方面,初始化gson需要多少毫秒?我认为你不需要考虑这种情况下的性能。
检查这个。
public static Gson gson;
public Constructor() {
}
public static Gson getInstance() {
if (gson == null) {
gson = new Gson();
}
return gson;
}
您只需调用getInstance()
函数来获取初始化的gson对象以备使用。每次它都不会初始化新的Gson
对象并重新使用旧的初始化对象。
就我个人而言,我将其作为 Dagger2 单例模块:
@Module
public class GsonModule {
@Provides
@Singleton
public Gson providesGson() {
Gson gson = new GsonBuilder()
.setExclusionStrategies(new ExclusionStrategy() { //Realm workaround
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getDeclaringClass().equals(RealmObject.class);
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
}).create();
return gson;
}
}
@Module
public class ApplicationModule {
private final CustomApplication application;
public ApplicationModule(CustomApplication application) {
this.application = application;
}
@Provides
@Singleton
public CustomApplication application() {
return this.application;
}
}
@Singleton
@Component(modules = {GsonModule.class, ApplicationModule.class})
public interface ApplicationComponent {
void inject(MainActivity mainActivity);
//exposed to sub-modules.
CustomApplication application();
}
但从技术上讲,这就像在某处有一个单独的对象。
一个实例化了一个新对象,另一个是...错误的,因为它有两个 returns。
如果您的代码中没有上述问题,第一个更好,因为在第二个中您有
return gson == null ? gson = new Gson() : gson;
它有一个开销空值检查,每次你请求一个 gson 对象时都必须完成。然而,这与 Gson 无关。这对于任何其他实例化都是一样的。所以你可以使用第一个就好了,关于 Gson,考虑是使用 new Gson()
还是 GsonBuilder.create()
更好,因为它有更多的自定义。
在以下两个选项中,您更喜欢哪个选项来初始化 Gson 对象?有人可以帮助我了解这两种方式对 Android 应用性能(启动时间?)的影响,如果有的话。
// inline creation
private final Gson gson = new Gson();
对
// need base creation, overhead of sync everytime while accessing gson object
private synchronized Gson getOrCreateGson() {
gson == null ? gson = new Gson() : gson;
return gson.fromJson(jsonString, clazz);
}
好的,从你的问题来看,你问的是哪种方法更适合处理 json 数据!
然后为此我建议您 2 个选项!!
让我知道哪个最适合你!!
编码愉快!!
这取决于您,但是 private static final
来处理这件事并没有错。您可以在 related question.
private static final Gson gson = new Gson();
如果您的 gson 对象不是静态的,那么您不必检查 gson 是否为空。如果您确定 gson 将经常使用,则内联选项更好(无空检查)。如果 gson 使用率太低,第二个选项可能更好。很多 "if" :)
另一方面,初始化gson需要多少毫秒?我认为你不需要考虑这种情况下的性能。
检查这个。
public static Gson gson;
public Constructor() {
}
public static Gson getInstance() {
if (gson == null) {
gson = new Gson();
}
return gson;
}
您只需调用getInstance()
函数来获取初始化的gson对象以备使用。每次它都不会初始化新的Gson
对象并重新使用旧的初始化对象。
就我个人而言,我将其作为 Dagger2 单例模块:
@Module
public class GsonModule {
@Provides
@Singleton
public Gson providesGson() {
Gson gson = new GsonBuilder()
.setExclusionStrategies(new ExclusionStrategy() { //Realm workaround
@Override
public boolean shouldSkipField(FieldAttributes f) {
return f.getDeclaringClass().equals(RealmObject.class);
}
@Override
public boolean shouldSkipClass(Class<?> clazz) {
return false;
}
}).create();
return gson;
}
}
@Module
public class ApplicationModule {
private final CustomApplication application;
public ApplicationModule(CustomApplication application) {
this.application = application;
}
@Provides
@Singleton
public CustomApplication application() {
return this.application;
}
}
@Singleton
@Component(modules = {GsonModule.class, ApplicationModule.class})
public interface ApplicationComponent {
void inject(MainActivity mainActivity);
//exposed to sub-modules.
CustomApplication application();
}
但从技术上讲,这就像在某处有一个单独的对象。
一个实例化了一个新对象,另一个是...错误的,因为它有两个 returns。
如果您的代码中没有上述问题,第一个更好,因为在第二个中您有
return gson == null ? gson = new Gson() : gson;
它有一个开销空值检查,每次你请求一个 gson 对象时都必须完成。然而,这与 Gson 无关。这对于任何其他实例化都是一样的。所以你可以使用第一个就好了,关于 Gson,考虑是使用 new Gson()
还是 GsonBuilder.create()
更好,因为它有更多的自定义。