zoukankan      html  css  js  c++  java
  • Effective Java 21 Use function objects to represent strategies

    Theory

    In the Java the function pointers is implemented by the declaring an interface to represent strategy and a class that implements this interface for each concrete strategy. It is possible to define an object whose methods perform operations on other objects, passed explicitly to the methods. An instance of a class that exports exactly one such method is effectively a pointer to that method.

       

    package com.effectivejava.classinterface;  

    import java.util.Arrays;

    import java.util.Comparator;

       

    /**

    * @author Kaibo

    *

    */

    public class StringLengthComparator implements Comparator<String> {  

    public static final StringLengthComparator INSTANCE = new StringLengthComparator();

           private StringLengthComparator() {

    }

    /*

    * override the super class key method.

    */

    public int compare(String s1, String s2) {

    return s1.length() - s2.length();

    }

       

    public static void main(String[] args) {

    String[] a = new String[] { "I", "This", "a", "is" };

    System.out.println("a origin values:");

    printStringArray(a);

    System.out.println("b sorted values:");

    Arrays.sort(a, StringLengthComparator.INSTANCE);

    for (int i = 0, len = a.length; i < len; i++)

    System.out.println(a[i]);

    System.out.println();

    String[] b = new String[] { "He", "is", "a", "programmer" };

    System.out.println("b origin values:");

    printStringArray(b);

    System.out.println("b sorted values:");

    System.out.println();

    // implement the compartor strategy by anounymous class

    Arrays.sort(b, new Comparator<String>() {

    public int compare(String s1, String s2) {

    return s1.length() - s2.length();

    }

    });

    }

    private static void printStringArray(String[] strs) {

    for (int i = 0, len = strs.length; i < len; i++)

    System.out.println(strs[i]);

    }

    }

       

    Note

    1. Please give a field a discriptive name for the specific implementation.
    2. The anonymous class may create a new instance for each invoking.
    3. When a concrete strategy is designed for repeated use, it is generally implemented as a private static member class and exported in a public static final field whose type is the strategy interface instead of expose it to the public directly.

    /**

    *

    */

    package com.effectivejava.classinterface;

    import java.io.Serializable;

    import java.util.Comparator;

    /**

    * @author Kaibo

    *

    */

    // Exporting a concrete strategy

    class Host {

    private static class StrLenCmp implements Comparator<String>, Serializable {

    private static final long serialVersionUID = 1L;

    public int compare(String s1, String s2) {

    return s1.length() - s2.length();

    }

    }

    // Returned comparator is serializable

    public static final Comparator<String> STRING_LENGTH_COMPARATOR = new StrLenCmp();

    // Bulk of class omitted

    }

       

    作者:小郝
    出处:http://www.cnblogs.com/haokaibo/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Activiti流程实例
    Activiti使用步骤 (IDEA)
    工作流简介
    并发编程常见面试题
    navicat自动备份数据,可实现每天定时备份
    MySQL, SQLite 和 PostgreSQL 关于information_schema 的一些查询(表结构,表信息,库信息....)
    GIS相关网站下载全国的GeoJSON格式数据可以到区县级数据
    GIS当中使用uDig打开shp图层,并查看数据结果
    解决Failed to execute goal org.apache.maven.plugins 错误,JDK版本不一致
    Maven插件maven-assembly-plugin进行打包部署
  • 原文地址:https://www.cnblogs.com/haokaibo/p/use-function-objects-to-represent-strategies.html
Copyright © 2011-2022 走看看