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/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    Billing Invoice Split Rule
    From ProjectMagazine
    Link to PMP
    测试发现数据库性能问题后的SQL调优
    被jQuery折腾得半死,揭秘为何jQuery为何在IE/Firefox下均无法使用
    解决'将 expression 转换为数据类型 nvarchar 时出现算术溢出错误。'
    几年来ASP.NET官方站点首次改版,意味着MVC时代全面到来?
    Collection was modified; enumeration operation may not execute.的异常处理
    解决Sandcastle Help File Builder报错问题
    如何查看Windows服务所对应的端口?
  • 原文地址:https://www.cnblogs.com/haokaibo/p/use-function-objects-to-represent-strategies.html
Copyright © 2011-2022 走看看