繁体   English   中英

从“ getter”方法获得价值的最佳方法

[英]Best Approch of Returning Value from 'getter' Method

“将类字段/属性设为私有” -是OOP中的最佳做法之一。 要访问private字段/属性,我们可以使用公共getter方法。 但是根据此博客,仅编写getter方法可能不够用(请参阅Quote 2) 它建议从getter方法返回字段/属性的副本(如果它是引用类型)。 通过遵循这种方法,我们可以使字段/属性不可修改。 请参见下面的代码-

public class Department{  
 Employee admin;  
 ...  
 ...  
 ...  
 public Employee getAdmin(){  
   return admin.clone();
 }  
}

因此,从现在开始,如果我们不使用任何setter,那么'admin'将无法被外部世界修改。 这种方法看起来非常不错。 但是我几乎找不到任何实现此方法的代码。 使用此方法是否有任何缺点,可能会削弱使用此方法的好处?
提前致谢。

这种方法的主要缺点是每次获取对象时都需要进行克隆,这是不理想的,因为理想情况下,您希望自己的吸气剂轻巧。

有两种方法无需克隆即可达到相似的效果:

  • 使Employee一成不变,并且
  • Employee一个不变的界面

第一种方法是不言自明的,非常有效,但是并不总是实用的,尤其是在对象表示需要在适当位置共享的状态的情况下。

第二种方法也很简单:而不是让Employee一类,使其与干将只有一个接口,使类EmployeeImpl实现Employee ,并有getter和setter,并使用类,当你需要的可变性。

public interface Employee {
    String getFirstName();
    String getLastName();
}
public class EmployeeImpl implements Employee {
    private String firstName;
    private String lastName;

    public String getFirstName() {return firstName;}
    public String getLastName() {return lastName;}
    public void setFirstName(String name) {firstName = name;}
    public void setLastName(String name) {lastName = name;}
}

这种方法可以通过强制转换为类来克服,但是大多数时候都是可以的。

如果您处于敌对环境中,对实际对象的任何修改都是极其有害的-例如,您正在公开一些可供所有人下载和使用的服务API,则必须采用您描述的完整克隆方法。 但是,这种情况很少见。

注意:自首次发布以来,我更改了此答案。 我建议的第一个解决方案存在继承问题,现在可以解决。

通常,克隆返回的对象是一个非常糟糕的选择。 除非对象非常简单,或者除非您的应用程序不是非常复杂,否则所有这些克隆很可能会带来大量开销。

针对您的特定情况的替代方法是拥有一个名为Employee的接口,该接口仅提供获取器。 然后,您还可以定义实现Employee并提供设置器的MutableEmployee类。

interface Employee {
    public String getName();
    public float getSalary();
}

class MutableEmployee implements Employee {
    private String name;
    private float salary;

    @Override
    public String getName() {
        return name;
    } 

    @Override
    public float getSalary() {
        return salary;
    }

    public void setSalary(float salary) {
        super.salary = salary;
    }

    public void setName(String name) {
        super.name = name;
    }
}

然后,您的Department类将进行如下修改:

class Department {
    private MutableEmployee admin;

    public Employee getAdmin() {
        return (Employee) admin;
    }

    public MutableEmployee getMutableAdmin() {
        return admin;
    }
}

定义MutableEmployee子类

当您想要创建MutableEmployee的子类(如MutableGraphicDesigner ,需要定义以下内容:

  1. interface GraphicDesigner extends Employee
  2. class MutableGraphicDesigner extends MutableEmployee implements GraphicDesigner

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM