`
eyesmore
  • 浏览: 378692 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

重构:重复代码(NIO中的粒度细分)

阅读更多

ServerSocketChannel 只能把OP_ACCEPT注册到某个Selector上,不能注册OP_CONNENCT,OP_READ,OP_WRITE事件;
而SocketChannel 恰恰相反,它能注册OP_CONNENCT,OP_READ,OP_WRITE事件,不能注册OP_ACCEPT。
但是,将某种Channel注册到某个Selector的操作绝大多数都是一样的,也就是说我们可以在超类中实现这些东西。

Bad smells in code中有提过“Duplicated code”,其中一种情况就是重复的代码出现在两个兄弟类中,我们应该把
共同的部分Pull up到超类中去,对于他们之间的不同部分,应该单独出来,细化成某个粒度更小的接口或抽象方法,以在
不同子类中不同实现。

 

SuperClass {

protected abstart void diffPart();
public  void operation() {
    //共同操作
 diffPart();
    //共同操作
}

}

 

SubClassOne {
 public void diffPart() {
    //subClassOne's part 
 }
}

 

SubClassTwo {
 public void diffPart() {
  //subClassTwo's part
 }
}

 

public abstract int validOps();//超类中细粒度的抽象方法
public final SelectionKey register(Selector sel, int ops,
				       Object att)
	throws ClosedChannelException
    {
	if (!isOpen())
	    throw new ClosedChannelException();
	if ((ops & ~validOps()) != 0)//各个子类不同的部分
	    throw new IllegalArgumentException();
	synchronized (regLock) {
	    if (blocking)
		throw new IllegalBlockingModeException();
	    SelectionKey k = findKey(sel);
            if (k != null) {
                k.interestOps(ops);
		k.attach(att);
            }
	    if (k == null) {
		// New registration
		k = ((AbstractSelector)sel).register(this, ops, att);
		addKey(k);
	    }
            return k;
        }
    }

子类 SocketChannel的实现:

 /**
     * Returns an operation set identifying this channel's supported
     * operations.
     *
     * <p> Socket channels support connecting, reading, and writing, so this
     * method returns <tt>(</tt>{@link SelectionKey#OP_CONNECT}
     * <tt>|</tt> {@link SelectionKey#OP_READ} <tt>|</tt> {@link
     * SelectionKey#OP_WRITE}<tt>)</tt>.  </p>
     *
     * @return  The valid-operation set
     */
    public final int validOps() {
	return (SelectionKey.OP_READ
		| SelectionKey.OP_WRITE
		| SelectionKey.OP_CONNECT);
    }

 

子类ServerSocketChannel的实现:

/**
     * Returns an operation set identifying this channel's supported
     * operations.
     *
     * <p> Server-socket channels only support the accepting of new
     * connections, so this method returns {@link SelectionKey#OP_ACCEPT}.
     * </p>
     *
     * @return  The valid-operation set
     */
    public final int validOps() {
	return SelectionKey.OP_ACCEPT;
    }

 

分享到:
评论

相关推荐

    xnio-nio-3.8.0.Final-API文档-中文版.zip

    Maven坐标:org.jboss.xnio:xnio-nio:3.8.0.Final; 标签:jboss、xnio、nio、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的...

    xnio-nio-3.8.4.Final-API文档-中文版.zip

    Maven坐标:org.jboss.xnio:xnio-nio:3.8.4.Final; 标签:jboss、xnio、nio、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的...

    xnio-nio-3.8.4.Final-API文档-中英对照版.zip

    Maven坐标:org.jboss.xnio:xnio-nio:3.8.4.Final; 标签:jboss、xnio、nio、jar包、java、中英对照文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档...

    xnio-nio-3.8.0.Final-API文档-中英对照版.zip

    Maven坐标:org.jboss.xnio:xnio-nio:3.8.0.Final; 标签:jboss、xnio、nio、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档...

    11丨答疑课堂:深入了解NIO的优化实现原理.html

    11丨答疑课堂:深入了解NIO的优化实现原理.html

    Java编程中的IO模型详解:BIO,NIO,AIO的区别与实际应用场景分析

    Java编程中的IO模型详解:BIO,NIO,AIO的区别与实际应用场景分析 IO模型在计算机编程中扮演着至关重要的角色,特别是在网络通信中。Java提供了三种主要的IO模型:BIO(Blocking IO),NIO(Non-blocking IO),...

    httpcore-nio-4.4.14-API文档-中文版.zip

    ... 赠送源代码:httpcore-nio-4.4.14-sources.jar; ... ... Maven坐标:org.apache.httpcomponents:httpcore-nio:4.4.14;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    优雅的操作文件:java.nio.file 库介绍.pdf

    `java.nio.file.Paths`模块提供静态方法创建`Path`对象,代表文件系统中的路径。`Path`类则包含一系列方法,用于处理和操作路径。例如: ```java import java.nio.file.Path; import java.nio.file.Paths; public ...

    httpcore-nio-4.4.6-API文档-中英对照版.zip

    ... 赠送源代码:httpcore-nio-4.4.6-sources.jar; ... ... Maven坐标:org.apache.httpcomponents:...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

    java8源码-nio:java8nio使用的总结

    nio java8 nio使用的总结 目录 1. NIO_NIO 与 IO 区别 NIO支持面向缓冲区的、基于通道的IO操作 IO NIO 面向流(Stream Oriented) 面向缓冲区(Buffer Oriented) 阻塞IO(Blocking IO) 非阻塞IO(NonBlocking ...

    httpcore-nio-4.4.12-API文档-中文版.zip

    ... 赠送源代码:httpcore-nio-4.4.12-sources.jar; ... ... Maven坐标:org.apache.httpcomponents:httpcore-nio:4.4.12;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    httpcore-nio-4.4.5-API文档-中文版.zip

    赠送jar包:... ... 赠送源代码:httpcore-nio-4.4.5-sources.jar; ... ... Maven坐标:org.apache.httpcomponents:httpcore-nio:4.4.5;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    Java ️总结:JVM,NIO,并发编程,MySQL,分库分表,微服务,分布式缓-Java-Summarize.zip

    本篇文章将深入探讨Java技术栈中的关键概念:JVM(Java虚拟机)、NIO(非阻塞I/O)、并发编程、MySQL数据库、数据库分库分表、微服务以及分布式缓存。 首先,JVM是Java程序运行的基础,它负责解释和执行Java字节码...

    httpcore-nio-4.4.10-API文档-中文版.zip

    ... 赠送源代码:httpcore-nio-4.4.10-sources.jar; ... ... Maven坐标:org.apache.httpcomponents:httpcore-nio:4.4.10;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    httpcore-nio-4.4.15-API文档-中文版.zip

    赠送jar包:httpcore-nio-4.4.15.jar 赠送原API文档:httpcore-nio-4.4.15-javadoc.jar 赠送源代码:httpcore-nio-4.4.15-sources.jar ...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    httpcore-nio-4.4.6-API文档-中文版.zip

    赠送jar包:httpcore-nio-4.4.6.jar 赠送原API文档:httpcore-nio-4.4.6-javadoc.jar 赠送源代码:httpcore-nio-4.4.6-sources.jar ...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。

    java nio示例代码

    2. **缓冲区(Buffer)**:缓冲区是NIO的核心,它在内存中分配一块区域来存储数据。在进行IO操作时,数据先被存入缓冲区,然后再从缓冲区读取。Buffer类提供了诸如capacity(容量)、limit(限制)和position(位置)...

    httpcore-nio-4.4.10-API文档-中英对照版.zip

    ... 赠送源代码:httpcore-nio-4.4.10-sources.jar; ... ... Maven坐标:org.apache.httpcomponents:...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

    httpcore-nio-4.4.15-API文档-中英对照版.zip

    赠送jar包:httpcore-nio-4.4.15.jar 赠送原API文档:httpcore-nio-4.4.15-javadoc.jar ...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。

Global site tag (gtag.js) - Google Analytics