欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

java8 默认方法_如何不使用Java 8默认方法

发布时间:2023/12/3 56 豆豆
生活随笔 收集整理的这篇文章主要介绍了 java8 默认方法_如何不使用Java 8默认方法 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

java8 默认方法

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

我在上一篇博客文章中讨论了默认方法的多重继承,以及它们在编译和运行时的行为。 这周,我将研究如何使用默认方法进行真正的继承,实际上,默认方法并非为之设计的。 出于这个原因,请您自担风险阅读这些行,并不意味着这是要遵循的模式,同样也并不意味着相反。 我在这里写的是一些可以使用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

java8 默认方法

创作挑战赛新人创作奖励来咯,坚持创作打卡瓜分现金大奖

总结

以上是生活随笔为你收集整理的java8 默认方法_如何不使用Java 8默认方法的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。