有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

在Java中,我们什么时候应该使用一个可以返回多个对象的单一、全面的getter方法,而不是一堆较小的getter方法?

澄清一下,我的意思是:

public Image getRespectiveImage(int temp) {
    switch(temp){
    case 1:return one;
    case 2:return two;
    case 3:return three;
    case 4:return four;
    case 5:return five;
    }
    return null;
}

相比

public Image getOne(){return one;}
public Image getTwo(){return two;}
public Image getThree(){return three;}
public Image getFour(){return four;}
public Image getFive(){return five;}

我倾向于选择前者,因为出于某种原因,它似乎更简单,但每个人似乎都在使用后者。有人会使用一堆getter方法的原因吗


共 (4) 个答案

  1. # 1 楼答案

    与第一种方法相比,使用一系列getter方法有两个明显的优势

    1. 如果命名正确,getter方法会自行记录从对象获得的内容
    2. 在第一种情况下,您需要向用户提供某种文档,告诉他们哪个输入对应于返回。当您有单独的getter时,这是不必要的。(这给客户带来了更大的负担)
  2. # 2 楼答案

    对于希望用户与之交互的所有私有变量,最好使用getter和setter

    虽然您的上述解决方案简化了,但它会让其他使用您的代码的人感到困惑,因为这不是常见的做法

  3. # 3 楼答案

    这并不是关于“哪一个更好或更糟”——如果你正在为其编写getter的属性本质上没有索引,那么为它们编写索引getter是没有意义的。如果属性不是同一类型的,这是一个很好的线索,说明索引表示通常不会有帮助

    如果您使用的属性作为索引列表来存储是有意义的,那么当然,无论如何——但是我也会为字段使用数组(请考虑:如果数组类型不适合该字段,那么可能索引的getter也不适合)

    您通常希望getter和setter反映您声明的字段。如果字段是数组类型(符合JavaBeans spec,第8.3.3节),可以使用一个getter/setter,它接受一个int索引参数

    你这么做有两个原因。首先,在概念层面上,如果你的字段与你的getter/setter显著不同,尽管有很多合理的理由,你可能想看看你是如何组织你的字段的,看看你是否可以重构到更准确地表示你的对象的目的的东西(假设公共getter/setter是这个目的的良好表示)。这可能预示着更大的设计问题

    其次,这更多的是关于意识到你在做什么,你的getter和setter会影响与在bean上运行的API的交互,也会影响与使用反射的API的交互。例如,可以将Hibernate配置为使用getter/setter属性或直接字段访问将对象持久化到数据库。因此,根据那里的配置,您必须至少了解getter/setter与field设置

    这里的要点是:不要试图带着一套规则来定义一种方式的好坏。只需考虑你正在使用的对象的性质,以及它们的属性实际上意味着什么(语义),并且编写一个公共接口,有意义。p>

  4. # 4 楼答案

    这取决于你面临的问题。第一种方法没有错,如果使用“枚举”来限制和记录选项,则更是如此:

    enum ImageCategory {
      Unchecked,
      Checked,
      Disabled;
    }
    
    Image getRespectiveImage(ImageCategory category);
    

    只要确保每一个“类别”都代表一个相同性质的实例

    另一方面,有这样的方法显然不是一件好事:

    Object get(String property);
    

    除非你在写自己的字典/地图课