Java 继承领域中最有效的方法?

Java 继承领域中最有效的方法?,java,Java,考虑由根类和一些子类组成的特定类层次结构 R | .--+--+------. | | ... | S1 S2 ... Sn 类R有一个特定类型的字段x,比如x,它不是一个简单的类型,每个子类都应该继承它。子类可以对字段x执行各种内部处理,并将其作为属性公开。 关于这两种编码风格中哪一种更可取,出现了某种讨论: 第一种解决方案 将classR声明x为私有字段,并提供公共getter和setter class R { .... private

考虑由根类和一些子类组成的特定类层次结构

    R
    |
 .--+--+------.
 |     |  ... |
S1     S2 ... Sn
类R有一个特定类型的字段
x
,比如
x
,它不是一个简单的类型,每个子类都应该继承它。子类可以对字段
x
执行各种内部处理,并将其作为属性公开。 关于这两种编码风格中哪一种更可取,出现了某种讨论:

第一种解决方案 将class
R
声明
x
为私有字段,并提供公共getter和setter

class R {
    ....
    private X x;

    ....

    public X getX() { ... }
    public void setX(X ax) { ... }
}
第二种解决方案 让class
R
声明
x
作为受保护字段


在您看来,哪一种可能是首选的解决方案?

如果必须使用继承,这是最安全的方法:

class R
{
  private X x;

  protected X getX()
  {
    return this.x;
  }
}

为什么不将
R
作为一个单独的类,并从
S1、S2、。。。Sn

如果必须使用继承,这是最安全的方法:

class R
{
  private X x;

  protected X getX()
  {
    return this.x;
  }
}

为什么不将
R
作为一个单独的类,并从
S1、S2、。。。Sn

如果希望子类访问变量,请保护。如果您希望您的子类使用方法对其进行修改,然后将其设置为私有

所有这些都取决于您希望其他类具有的访问权限


编辑:(第一种解决方案)

如果希望子类访问变量,请保护。如果您希望您的子类使用方法对其进行修改,然后将其设置为私有

所有这些都取决于您希望其他类具有的访问权限


编辑:(第一种解决方案)

这取决于您希望允许对内部X执行的操作。如果您希望从外部访问/修改它,请公开获取/设置。但如果您希望它们只能由其子类修改,那么就使用protected,仅此而已。IMHO

这取决于您希望允许对内部X执行的操作。如果您希望从外部访问/修改它,请公开获取/设置。但如果您希望它们只能由其子类修改,那么就使用protected,仅此而已。IMHO

首选专用字段。但是,您不应该从另一个类更改另一个对象的内部状态,即使它是一个子类

听起来好像在R、S1、S2等和X之间插入了巨大的耦合。最好考虑另一种面向对象的设计,在对象之间清晰地分配职责。


在子类化之前,请考虑查看Liskov替换原则。

最好使用私有字段。但是,您不应该从另一个类更改另一个对象的内部状态,即使它是一个子类

听起来好像在R、S1、S2等和X之间插入了巨大的耦合。最好考虑另一种面向对象的设计,在对象之间清晰地分配职责。


在子类化之前,考虑一下Liskov替换原则。

为什么要使用直接子类化?这通常应该避免,因为它在类之间创建了紧密耦合,而您通常可以避免这种耦合。经验法则:更喜欢协作而不是扩展(更喜欢接口而不是超类),该层次结构表示backbeans的层次结构,我在其中移动了基类(R)中的所有公共/样板代码。每个子类都是一个与各种jsf页面相关的backbean。为什么要使用直接子类呢?这通常应该避免,因为它在类之间创建了紧密耦合,而您通常可以避免这种耦合。经验法则:更喜欢协作而不是扩展(更喜欢接口而不是超类),该层次结构表示backbeans的层次结构,我在其中移动了基类(R)中的所有公共/样板代码。每个子类都是一个与各种jsf页面相关的backbean。您还可以创建受保护的getter/setter,而不是让子类直接访问受保护的字段。阿德里安·科斯特评论得很好。如果变量对于子类是“完全”可访问的,那么您应该可以直接访问它们,它们应该受到保护,而不需要方法。但是,如果您正在制作一个API,或者您对类的设计没有完全的把握,那么为了保护您的代码不受未来更改的影响,按照您所说的做将是最好的选择。这里涉及到很多问题,例如,“更快”的直接访问与代码可修改性。最后,我想这完全取决于父类的用途。您还可以创建受保护的getter/setter,而不是让子类直接访问受保护的字段。阿德里安·科斯特评论得很好。如果变量对于子类是“完全”可访问的,那么您应该可以直接访问它们,它们应该受到保护,而不需要方法。但是,如果您正在制作一个API,或者您对类的设计没有完全的把握,那么为了保护您的代码不受未来更改的影响,按照您所说的做将是最好的选择。这里涉及到很多问题,例如,“更快”的直接访问与代码可修改性。最后,我想这完全取决于父类的用途。