当前位置: 首页 > news >正文

烟台建网站腾讯用户体验网站

烟台建网站,腾讯用户体验网站,在网站后台管理系统里产品说明怎么添加图片,中国十大购物网站编写好的API很难。 非常辛苦。 如果您想让用户喜欢您的API#xff0c;则必须考虑很多事情。 您必须在以下两者之间找到适当的平衡#xff1a; 有用性 易用性 向后兼容 前向兼容性 之前#xff0c;在我们的文章#xff1a; 如何设计良好的常规API中#xff0c;我们已经… 编写好的API很难。 非常辛苦。 如果您想让用户喜欢您的API则必须考虑很多事情。 您必须在以下两者之间找到适当的平衡 有用性 易用性 向后兼容 前向兼容性 之前在我们的文章 如何设计良好的常规API中我们已经就此主题进行过博客讨论。 今天我们将研究如何… Java 8更改规则 是! 重载是一个很好的工具可以在两个方面提供便利 通过提供参数类型替代 通过提供参数默认值 来自JDK的上述示例包括 public class Arrays {// Argument type alternativespublic static void sort(int[] a) { ... }public static void sort(long[] a) { ... }// Argument default valuespublic static IntStream stream(int[] array) { ... }public static IntStream stream(int[] array, int startInclusive, int endExclusive) { ... } } jOOQ API显然充满了这种便利。 由于jOOQ是SQL的DSL 我们甚至可能会滥用一点 public interface DSLContext {T1 SelectSelectStepRecord1T1 select(SelectFieldT1 field1);T1, T2 SelectSelectStepRecord2T1, T2 select(SelectFieldT1 field1, SelectFieldT2 field2);T1, T2, T3 SelectSelectStepRecord3T1, T2, T3 sselect(SelectFieldT1 field1, SelectFieldT2 field2, SelectFieldT3 field3);T1, T2, T3, T4 SelectSelectStepRecord4T1, T2, T3, T4 select(SelectFieldT1 field1, SelectFieldT2 field2, SelectFieldT3 field3, SelectFieldT4 field4);// and so on... } 诸如Ceylon之类的语言通过声称以上内容是在Java中使用重载的唯一合理原因将便利性这一概念进一步提高了。 因此锡兰Ceylon的创建者已完全消除了其语言中的重载将以上内容替换为联合类型和参数的实际默认值。 例如 // Union types void sort(int[]|long[] a) { ... }// Default argument values IntStream stream(int[] array,int startInclusive 0,int endInclusive array.length) { ... } 阅读“我希望我们在Java中拥有的十大锡兰语言功能” 以获取有关锡兰的更多信息。 不幸的是在Java中我们不能使用联合类型或参数默认值。 因此我们必须使用重载为API使用者提供便捷的方法。 但是如果您的方法参数是一个函数接口 则在方法重载方面Java 7和Java 8之间的情况发生了巨大变化。 JavaFX在此提供了一个示例。 JavaFX的“不友好”的ObservableList JavaFX通过使它们“可观察”来增强JDK集合类型。 不要与Observable混淆 Observable是JDK 1.0和Swing之前的恐龙类型。 JavaFX自己的Observable本质上是这样的 public interface Observable {void addListener(InvalidationListener listener);void removeListener(InvalidationListener listener); } 幸运的是这个InvalidationListener是一个功能接口 FunctionalInterface public interface InvalidationListener {void invalidated(Observable observable); } 这很棒因为我们可以做以下事情 Observable awesome FXCollections.observableArrayList(); awesome.addListener(fantastic - splendid.cheer()); 请注意我是如何用更愉快的术语替换foo / bar / baz的。我们都应该这样做。Foo和bar是如此1970 不幸的是当我们做我们可能要做的事情时事情变得更加繁琐。 也就是说与其声明一个Observable Observable是一个更加有用的ObservableList ObservableListString awesome FXCollections.observableArrayList(); awesome.addListener(fantastic - splendid.cheer()); 但是现在我们在第二行收到编译错误 awesome.addListener(fantastic - splendid.cheer()); // ^^^^^^^^^^^ // The method addListener(ListChangeListener? super String) // is ambiguous for the type ObservableListString 因为本质上... public interface ObservableListE extends ListE, Observable {void addListener(ListChangeListener? super E listener); } 和… FunctionalInterface public interface ListChangeListenerE {void onChanged(Change? extends E c); } 再一次在Java 8之前这两种侦听器类型是完全可区分的并且仍然是。 您可以通过传递命名类型来轻松调用它们。 如果我们编写以下代码我们的原始代码仍然可以使用 ObservableListString awesome FXCollections.observableArrayList(); InvalidationListener hearYe fantastic - splendid.cheer(); awesome.addListener(hearYe); 要么… ObservableListString awesome FXCollections.observableArrayList(); awesome.addListener((InvalidationListener) fantastic - splendid.cheer()); 甚至… ObservableListString awesome FXCollections.observableArrayList(); awesome.addListener((Observable fantastic) - splendid.cheer()); 所有这些措施将消除歧义。 但坦率地说如果您必须显式键入lambda或参数类型则lambda的性能只有后者的一半。 我们拥有现代化的IDE它们可以执行自动补全并帮助推断类型就像编译器本身一样。 想象一下如果我们真的想调用另一个addListener()方法它需要一个ListChangeListener。 我们必须写任何 ObservableListString awesome FXCollections.observableArrayList();// Agh. Remember that we have to repeat String here ListChangeListenerString hearYe fantastic - splendid.cheer(); awesome.addListener(hearYe); 要么… ObservableListString awesome FXCollections.observableArrayList();// Agh. Remember that we have to repeat String here awesome.addListener((ListChangeListenerString) fantastic - splendid.cheer()); 甚至… ObservableListString awesome FXCollections.observableArrayList();// WTF... extends String?? But thats what this thing needs... awesome.addListener((Change? extends String fantastic) - splendid.cheer());必须警惕。 API设计很难。 以前很难现在变得越来越难。 在Java 8中如果您的API方法的任何参数是功能接口请三思而后行重载该API方法。 一旦您确定要继续进行重载请再次思考这是否真的是一个好主意。 不服气吗 仔细看一下JDK。 例如java.util.stream.Stream类型。 您看到多少个具有相同数量的功能接口参数的重载方法而这些接口又使用了相同数量的方法参数就像我们前面的addListener()示例中一样 零。 在重载参数编号不同的地方有重载。 例如 R R collect(SupplierR supplier,BiConsumerR, ? super T accumulator,BiConsumerR, R combiner);R, A R collect(Collector? super T, A, R collector); 调用collect()时您永远不会有任何歧义。 但是如果参数编号没有不同并且参数本身的方法参数编号也没有变化则方法名称也不同。 例如 R StreamR map(Function? super T, ? extends R mapper); IntStream mapToInt(ToIntFunction? super T mapper); LongStream mapToLong(ToLongFunction? super T mapper); DoubleStream mapToDouble(ToDoubleFunction? super T mapper); 现在这在呼叫站点上非常令人讨厌因为您必须事先考虑必须根据各种相关类型使用哪种方法。 但这确实是解决这一难题的唯一方法。 因此请记住 您会为Lambdas应用重载感到遗憾 翻译自: https://www.javacodegeeks.com/2015/02/you-will-regret-applying-overloading-with-lambdas.html
http://www.pierceye.com/news/389567/

相关文章:

  • 阅读网站建设简易做海报网站
  • 上海企业网站建设推荐wordpress登录插件
  • 做网站的人联系电话可做产品预售的网站
  • 内部网络网站怎么做微信公众号推文制作软件
  • 什么网站做adsense好酒店官方网站建设书
  • 国家城乡与住房建设部网站做海报有什么参考的网站
  • 建德营销型网站建设企业邮箱地址怎么填写
  • 网站建设规划书总结怎么写wordpress 菜单链接
  • 网站目录程序重庆市建筑工程造价信息网官网
  • WordPress上传后找不到seo优化工程师
  • wordpress登录界面插件如何优化培训方式
  • 贵州建网站网站怎么优化自己免费
  • 个人网站介绍源码网站制作昆山
  • 网站开发属于知识产权吗如何制作软件程序
  • 外贸网站模板源码网络架构如何写
  • 网站建设美工的职位要求建材做哪些网站好
  • 淘宝客自建网站wap免费空间
  • python快速搭建网站如何制作一个微信刷题小程序
  • 域名备案与网站备案网站漏洞解决
  • 公明做网站多少钱高端网站设计怎么样
  • 重庆网站建设 熊掌号wordpress 被发文章
  • 网站建设管理视频广东省农业农村厅班子
  • 网站建设需要钱吗开发一个小程序流程
  • 通州富阳网站建设做足彩网站推广
  • 一个公司做网站需要注意什么条件车之家汽车官网
  • 石家庄网站建设网站建设网站的制作哪家好
  • 苏州晶体公司网站网站排名优化各公司的
  • 网站开发大致多少钱团队拓展训练
  • p2p网站建设方案卫龙模仿iphone做网站
  • 做盗版电影网站犯法吗Wordpress 淘宝客 页面