java默认构造方法_如何不使用Java 8默认方法

java默认构造方法

java默认构造方法

警告:一旦阅读,您将无法看不到它

我在上一篇博客文章中讨论了默认方法的多重继承,以及它们在编译和运行时的行为。 这周,我将研究如何使用默认方法进行真正的继承,实际上,默认方法并非为之设计的。 出于这个原因,请您自担风险阅读这些行,并不意味着这是要遵循的模式,同样也并不意味着相反。 我在这里写的是一些可以使用Java 8进行编码的编码技术,但是它们的可用性至少对我来说值得怀疑。 我也有点害怕从瓶子里放一些香水,但另一方面,那些香水根本就不会留在那里。 总有一天有人会说出来。 至少我附上了警告标志。

样本问题

几年前,我在一个应用程序上工作,该应用程序使用了许多不同类型的对象,每个对象都有一个名称。 在许多课程开始包含之后

public String getName(){...}
public void setName(String name){...}

复制粘贴代码的方法只是设置者和获取者,只是让整个房间难以忍受。 因此我们创建了一个类

class HasName {
  public String getName(){...}
  public void setName(String name){...}
}

每个具有名称的类都只是扩展了该类。 实际上,它长时间没有工作。 有些班级已经扩展了其他班级。 在那种情况下,我们只是试图在继承行中将HasName向上移动,但是在某些情况下,它只是行不通。 当我们到达最高峰时,我们意识到那些阶级及其后代没有名字,为什么要强迫他们? 老实说,在现实生活中,这比仅仅拥有名字要复杂得多。 如果只是名称,我们可以将其与其他具有名称的类一起使用。 事情变得更加复杂,这只会使话题变得更加复杂,并让我相信:它将变得足够复杂。

简介:我们无法实现在某些备用类中实现的某些对象的名称。 但是现在我们可以使用默认方法来做到这一点。

具有默认实现的HasName接口

默认方法仅提供默认功能。 默认方法可以访问this变量, this变量始终是实现接口的对象,并且代表该方法被调用。 如果有一个接口I和C类实现接口,当一个上的方法C c对象被调用变量this实际上是对象c 。 您将如何实现getName()setName()

这些是访问对象中的String变量的设置方法和获取方法。 您不能从界面访问它。 但是,将值存储在对象中并不是绝对必要的。 唯一的要求是,为对象设置的任何内容都将相同。 我们可以将值存储在其他位置,每个对象实例一个。 因此,我们需要一些可以与对象配对的值,并且该值的生存期必须与该对象的生存期相同。 它会响吗?

这是一个弱哈希表! 是的。 并使用它可以轻松实现HasName接口。

public interface HasName {
    class Extensions {
        private static final WeakHashMap<HasName, String> map = new WeakHashMap<>();
    }
    default void setName(String name) {
        Extensions.map.put(this, name);
    }
    default String getName() {
        return Extensions.map.get(this);
    }
}

您所要做的就是在该类实现的接口列表的末尾写: ,HasName ,它神奇地拥有了。

在此示例中,唯一存储的值是String 。 但是,您可以拥有任何类而不是String并且不仅可以实现setter和getter,而且可以实现对该类执行某些操作的任何方法。 大概这些实现将在类中实现,并且默认方法将仅委托。 您可以将类放置在其他位置,也可以将其作为内部类放在接口中。 品味和风格的问题。

结论

接口不能具有实例字段。 为什么? 因为在那种情况下,它们不是接口而是类。 Java没有多重实现继承。 也许有,但是“请不要使用”。 默认方法是技术错误。 您可以称其为妥协。 使用功能方法扩展时,需要一些东西来保持JDK库的向后兼容性。 您仍然可以使用弱哈希映射模拟接口中的字段,以访问要委派的字段和方法的继承类“ vtable”。 有了它,您可以进行真正的多重继承。 您的母亲经常警告您的类型。 我告诉你队友!

另一个警告:以上实现不是线程安全的。 如果您尝试在多线程环境中使用它,则可能会收到ConcurrentModificationException,或者甚至可能会在弱哈希映射上调用get()进入无限循环,并且永不返回。 我不告诉您在这种情况下如何解决弱哈希映射的使用问题。 或者,好吧,我改变了主意,然后做了:只使用默认方法使用的默认方法。

翻译自: https://www.javacodegeeks.com/2014/04/how-not-to-use-java-8-default-methods.html

java默认构造方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值