这是在没有 get/set-ters 的情况下改造 POJO 的正确方法吗?

Posted

技术标签:

【中文标题】这是在没有 get/set-ters 的情况下改造 POJO 的正确方法吗?【英文标题】:Is this the right approach to Retrofit POJO without get/set-ters? 【发布时间】:2015-12-01 12:20:01 【问题描述】:

简介

我的代码运行良好。我很想知道这种方法对于这个特定用例是否可以,因为我找不到使用 GSON 或其他 JSON 解析库但只是使用 POJO 来保存数据。

(注意,我已经尝试格式化我的代码一段时间了!对此感到抱歉)

对于这个例子,我从 TMDB 的 API 请求数据:.../3/movie/id?API_KEY=x

以 JSON 格式返回的数据(已减少。请关注“评论”对象)


"vote_count":2034,
"reviews":
    "page":1,
    "results":[
        
            "id":"55660928c3a3687ad7001db1",
            "author":"Phileas Fogg",
            "content":"Fabulous action movie. Lots of interesting characters. They don't make many movies like this. The whole movie from start to finish was entertaining I'm looking forward to seeing it again. I definitely recommend seeing it.",
            "url":"http://j.mp/1HLTNzT"
        ,
        
            "id":"55732a53925141456e000639",
            "author":"Andres Gomez",
            "content":"Good action movie with a decent script for the genre. The photography is really good too but, in the end, it is quite repeating itself from beginning to end and the stormy OST is exhausting.",
            "url":"http://j.mp/1dUnvpG"
        
    ],
    "total_pages":1,
    "total_results":2
,
"trailers":
    "quicktime":[

    ],
    "youtube":[
        
            "name":"Trailers From Hell",
            "size":"HD",
            "source":"FRDdRto_3SA",
            "type":"Featurette"
        ,
        
            "name":"Trailer 2",
            "size":"HD",
            "source":"jnsgdqppAYA",
            "type":"Trailer"
        ,
        
            "name":"Official Trailer #1",
            "size":"HD",
            "source":"YWNWi-ZWL3c",
            "type":"Trailer"
        
    ]

方法

    创建了改造界面。希望我可以在这里展示它,但格式会变得很复杂。

    这是奇怪的部分。我创建了一个 POJO,如下所示,它工作正常。

    公共类 TMDBMovieDetailsRetrofitObj

    //movie/id 端点中可用的运行时 公共字符串运行时;

    公共字符串标语;

    公开评论评论;

    公开课评论

    public Reviews()  reviews = new Reviews(); 
    
    // To know how many reviews we have got!
    public String total_results;
    
    public List<ReviewResults> results;
    
    public class ReviewResults
    
        public ReviewResults() 
            results = new ArrayList<>();
        
    
        public String id;
        public String author;
        public String content;
        public String url;
    
    

没有创建 getter 和 setter 方法,因为我有另一个 TMDBMovie 对象,它包含大量信息并且有自己的 getter 和 setter 方法。

    基本上,我将这个 POJO 用作中间传输对象的东西...

我的问题

这两点你觉得可以吗:

    这个 POJO 有 3 级公共嵌套类,Retrofit 处理得很好。

    我确实有一个 TMDBMovie 对象,它有自己的 getter 和 setter 方法,我通过这些方法进行检查、验证和少量数据操作。如果公共变量没有问题,这个 POJO 是否还需要 getter 和 setter 方法?

【问题讨论】:

【参考方案1】:

命名您的类变量以便将 JSON 转换为 Java 对象是一个好主意。但是,这些类不需要嵌套。您可以定义 List&lt;Result&gt; results 并在其他地方定义 Result 类。希望这很清楚。

【讨论】:

你说的对不需要嵌套的类,但是来自 Python 背景,创建多个文件感觉很奇怪。我需要改变对 Java 的看法。【参考方案2】:
    不,它们的三层嵌套类定义令人困惑,可能会增加维护问题。此外,试图初始化外部类字段的嵌套类构造函数有点粗略。只需将每个类实现一个自己的类 --

TMDBMovieDetailsRetrofitObj.java

public class TMDBMovieDetailsRetrofitObj 
    // Runtime available in movie/id endpoint
    public String runtime;
    public String tagline;
    public Reviews reviews;

Review.java

public class Reviews 
    // To know how many reviews we have got!
    public String total_results;
    public List<ReviewResults> results;

ReviewResults.java

public class ReviewResults 
    public String id;
    public String author;
    public String content;
    public String url;

    这是一个有争议和个人偏好的问题。对于仅用于没有其他方法和行为的数据的对象,尤其是像您这样的短期数据操作对象,跳过 getter 和 setter 通常是可以接受的,尤其是在 android 上。其他人可能有不同的看法。如果您的老板或老师对此事有意见,请按照他们的要求行事!

【讨论】:

感谢@iagreen 的明确解释。 1. 嗯,关于维护问题,你是对的。尽管我认为要求不会改变;他们可能有朝一日。 2. 确实,最好的做法是拥有gets/sets。在这种情况下,我有一个专门用于 Movie 的对象,该对象具有自己的 get/sets,这些 get/sets 具有验证和 if-null 案例。谢天谢地,这是针对我的 Udacity Android 课程,而不是针对大学。

以上是关于这是在没有 get/set-ters 的情况下改造 POJO 的正确方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用 GSON 或 android 中的任何其他库的情况下使用改造以字符串形式获得响应 [重复]

离线时使用 OKHttp 进行改造如何使用缓存数据

在没有内核支持的情况下唤醒线程

错误:节点画布是在没有 JPEG 支持的情况下构建的

MongoDB 警告:--rest 是在没有 --httpinterface 的情况下指定的

以下模块是在启用优化或没有调试信息的情况下构建的