【问题标题】:Is there any advantage to using protected variables over getters and setters? [duplicate]使用受保护的变量而不是 getter 和 setter 有什么好处吗? [复制]
【发布时间】:2013-06-28 06:02:42
【问题描述】:

忽略使变量protected 很方便这一事实,是否有任何东西实际上需要protected 的存在?

【问题讨论】:

  • 您可以拥有必须由您的类的子类实现的public void init() { basicInit(); }abstract protected void basicInit()(仅作为示例)。

标签: java


【解决方案1】:

即使您使用 getter 和 setter(我个人会使用 - 我几乎总是将字段保密),但这并不意味着 protected 变得毫无意义......这只是意味着您可能会使用 getter 和设置者自己 protected 而不是变量。

如果您的问题真的是关于 protected 可访问性是否有用,我会说是 - 拥有一个只能由子类访问的成员通常是有意义的。不仅如此,我有时会使用一个受保护的抽象方法,该方法由超类调用,但在层次结构之外无法访问。

例如,在模板方法模式中,您可能有一个公共方法,它会进行一些设置,调用受保护的抽象方法,然后可能还会进行一些最终工作。您不想公开抽象方法,因为您想确保执行开始/结束代码......并且您不想强制子类显式调用该代码。

【讨论】:

    【解决方案2】:

    假设您要创建一个包含可变燃料的类car。您不希望直接从外部设置此变量,因为燃料使用量取决于汽车。但是,如果有人扩展car,他们应该可以修改它。

    class Car {
        protected float fuelLevel;
        public float getFuel() { 
            return this.fuelLevel;
        }
        public void drive() {
            this.fuelLevel -= 0.5; // fuel usage of an average car
        }
    }
    
    
    class Ferrari extends Car {
        public void drive() { // override drive method
            this.fuelLevel -= 2; // obviously, a Ferrari consumes much more fuel!
        }
    }
    

    您也可以使用protected void setFuel(...) 方法来做同样的事情。

    【讨论】:

      【解决方案3】:

      protected 属性可以标记为abstract,也可以标记为virtual 并被覆盖。使用变量而不是属性可以防止这种情况,并强制派生类直接使用基类的实现。

      【讨论】:

      • 那么将方法定为最终...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-17
      • 2016-03-08
      • 2014-12-20
      • 1970-01-01
      • 2015-03-05
      相关资源
      最近更新 更多