当前位置:  编程技术>综合
本页文章导读:
    ▪Effective Java:Ch2_创建销毁对象:Item1_考虑用工厂方法替代构造函数              本章的主题是创建和销毁对象:何时创建、怎样创建;何时应该避免创建、如何避免创建;如何确保对象适时被销毁;如何管理对象销毁前的清理动作。  .........
    ▪Django项目09      从项目07进一步演化。 准备工作 service mysqld start django-admin.py startproject web09 django-admin.py startapp blog templates创建 admin.py创建 配置(admin,settings,templates)(models,views,urls) M:models,templates V.........
    ▪connect to MySQL 10061 grant      在ubuntu下安装了mysql数据库,用Navicat客户端不能链接上,报如下错误error:ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061) 1)服务器上mysql -uroot -p123456 查询可以登录 2)ping OK 3)服务器上.........

[1]Effective Java:Ch2_创建销毁对象:Item1_考虑用工厂方法替代构造函数
    来源: 互联网  发布时间: 2013-11-10

        本章的主题是创建和销毁对象:何时创建、怎样创建;何时应该避免创建、如何避免创建;如何确保对象适时被销毁;如何管理对象销毁前的清理动作。


        一个类如果要允许客户获得其实例,常用方法是提供一个public的构造函数。还有另外一个方法,也应该在每个程序员的工具集中占有一席之地:类可以提供一个public的静态工厂方法,这个方法返回类的实例。【例】下面是Boolean类(基本类型boolean对应的包装类)代码里的一个简单示例,该方法将一个boolean简单类型转换为一个Boolean对象引用。       

public static Boolean valueOf(boolean b){
    return b ? Boolean.TRUE : Boolean.FALSE;
}
        注意这里讲的静态工厂方法与设计模式中的工厂方法模式是不一样的,它在设计模式中没有直接等价物。

        类可以提供给它的客户静态工厂方法,用来替代构造方法,或作为构造方法的补充。用静态工厂方法来替代public构造方法既有优点也有缺点。


        优点一:静态工厂方法不同于构造函数,他们有名称。如果构造函数的参数不能确切地描述正被返回对象,那么具有合适名称的静态工厂方法就更易用,对应的客户端代码页更加易于阅读。【例】例如,构造方法BigInteger(int, int, Random)返回一个可能为素数的BigInteger,而用一个名为BigInteger.probablePrime()的静态工厂方法就更好。(JDK1.4最终增加了这个方法。)

public class BigInteger extends Number implements Comparable<BigInteger> {

    public static BigInteger probablePrime(int bitLength, Random rnd) {
        if (bitLength < 2)
            throw new ArithmeticException("bitLength < 2");

        // The cutoff of 95 was chosen empirically for best performance
        return (bitLength < SMALL_PRIME_THRESHOLD ?
                smallPrime(bitLength, DEFAULT_PRIME_CERTAINTY, rnd) :
                largePrime(bitLength, DEFAULT_PRIME_CERTAINTY, rnd));
    }

    public BigInteger(int bitLength, int certainty, Random rnd) {
        BigInteger prime;

        if (bitLength < 2)
            throw new ArithmeticException("bitLength < 2");
        // The cutoff of 95 was chosen empirically for best performance
        prime = (bitLength < 95 ? smallPrime(bitLength, certainty, rnd)
                                : largePrime(bitLength, certainty, rnd));
        signum = 1;
        mag = prime.mag;
    }

}
        对于指定的方法签名,一个类只能有一个对应的构造函数。程序员通常这样来避开这个限制:可以提供两个构造函数,他们的参数列表仅仅是参数类型的顺序不同。这实在是一个坏主意。API的用户将不会记得这些构造函数哪个是哪个,常会无意地调用错误的构造函数。其他人读到使用这些构造函数的代码时,将不会知道这些代码是做什么的,除非参考类文档。

        由于静态工厂方法有名称,所以没有上述限制。假如一个类需要方法签名相同的多个构造函数,就用静态工厂方法来替代构造函数,并仔细地选择方法名称以便突出它们之间的区别。


        优点二:静态工厂方法不同于构造函数,无需每次被调用时都创建一个新对象。这使得非可变类(Item15)可以使用预先创建的实例,或者在创建实例时缓存起来,之后分发给客户,从而避免创建不必要的重复对象。Boolean.valueOf(boolean)方法演示了这种技术:它从不创建对象。这种技术类似于Flyweight模式。如果客户端经常请求创建相同的对象,那这种技术能极大的提高性能,尤其是当创建对象开销很大时。

        静态工厂方法可以再反复调用时返回同一个对象,这使得类可以严格控制在哪个时刻有哪些实例存在。这种类又被称为实例受控的类(instance-controlled)。编写实例受控的类有这么几个理由:第一,实例受控允许一个类确保是单例的(Item3),或者是不可实例化的(Item4);同时,实例受控允许非可变类(Item15)确保不会存在两个相等的实例,即当且仅当a==b时才有a.equals(b),如果一个类做出了这种保证,则它的客户端可以用==操作符来地带equals(Object)方法,这可能会提高性能。枚举类型(Item30)就保证了这一点。


        优点三:静态工厂方法不同于构造函数,它能返回任意子类型的对象。这让你在选择返回对象的类型时有了很大的灵活性。

        这种灵活性的一个应用是,API可以返回一个对象,而无需使对象的类public。用这种方式隐藏实现类能够产生一个非常紧凑的API。这种技术适用于基于接口的框架(interface based frameworks, Item18),在这种框架中,接口成为静态工厂方法的自然返回类型。由于接口不能有静态方法,所以按照惯例,接口Type的静态工厂方法被放在一个名为Types的不可实例化类(noninstantiable class, Item4)中。

        【例】例如,Java集合框架中有32个集合接口的便利实现,提供不可修改的集合、同步集合等等。几乎所有的实现都通过一个不可实例化类(java.util.Collections)中的静态工厂方法导出,返回对象的类都是非public的。——Collections.unmodifiableMap(Map)方法的返回类型是UnmodifiableMap,是个private类!

public class Collections {
    public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K, ? extends V> m) {
        return new UnmodifiableMap<K,V>(m);
    }

    private static class UnmodifiableMap<K,V> implements Map<K,V>, Serializable {
    }
}
        如果把上述便利实现都作为public类导出,那集合框架API会臃肿很多。而且这并不仅仅是API数量的减少,还有conceptual weight的减轻。用户知道返回的对象都是由API通过接口精确定义了的,所以无需为实现类阅读额外的类文档。此外,使用静态工厂方法后,要求客户端通过接口来引用返回对象,而不是通过实现类来引用返回对象,这通常是一个好习惯。


        public静态工厂方法返回的对象类型不仅是可以非public,而且还能根据参数的不同而返回不同的类型。只要是所声明的返回类型的任何子类型,都是允许的。为了提高软件可维护性和性能,返回类型还可以随着版本的不同而不同。

        【例】JDK1.5版本引入的java.util.EnumSet类没有public构造函数,只有静态工厂方法。根据底层枚举类型的大小,这些工厂方法可以返回两种实现:如果拥有64个或更少的元素(大多数枚举类型都是这样),静态工厂方法返回一个RegularEnumSet实例,用单个long来支持;如果枚举类型拥有65个或更多的元素,静态工厂方法则返回JumboEnumSet实例,用long数组来支持。

        这两种实现类的存在对客户端是不可见的。如果RegularEnumSet对于小的枚举类型提供性能优势,那么就能在以后的版本中删掉,并不产生副作用。同样,如果可以提高性能,以后版本可以增加EnumSet的第三或第四个实现。客户端不知道也不关心静态工厂返回的对象的类型,客户端只关心它是EnumSet的某个子类。       

public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E>
    implements Cloneable, java.io.Serializable
{
    public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
        Enum[] universe = getUniverse(elementType);
        if (universe == null)
            throw new ClassCastException(elementType + " not an enum");

        if (universe.length <= 64)
            return new RegularEnumSet<E>(elementType, universe);
        else
            return new JumboEnumSet<E>(elementType, universe);
    }
}

class RegularEnumSet<E extends Enum<E&g      
    
[2]Django项目09
    来源: 互联网  发布时间: 2013-11-10

从项目07进一步演化。

准备工作

service mysqld start
django-admin.py startproject web09
django-admin.py startapp blog
templates创建
admin.py创建

配置(admin,settings,templates)(models,views,urls)

M:models,templates
V:views
C:urls
settings

DATABASES = { 
    'default': {
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'web09',                 
        'USER': 'root',                     
        'PASSWORD': '',                  
        'HOST': '',                     
        'PORT': '',                    
    }   
}

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
    'django.contrib.admin',              #重点是这个,admin 1号
)

models,一个class对应一张表

#coding:utf8
from django.db import models
class Zheng(models.Model):
    title = models.CharField(max_length=30)
    content = models.TextField()
    def __unicode__(self):
        return self.title

把数据库注册入admin.py

#coding:utf8                                          admin 2号 
from django.contrib import admin         
from blog.models import Zheng 
admin.site.register(Zheng)

数据库的写入,服务器的运行

python manage.py syncdb
python manage.py runserver

配置views

#coding:utf8
from django.shortcuts import render_to_response
from blog.models import Zheng
def index(req,template_name):
    news = Zheng.objects.all()
    return render_to_response(template_name,{'news':news})
def show(req,id):
    news = Zheng.objects.all()
    new = Zheng.objects.get(id=id)
    return render_to_response('zhengzhi.html',{'new':new,'news':news})


配置urls

from django.conf.urls.defaults import patterns, include, url
from django.contrib import admin                    #admin 3号
admin.autodiscover()                                #admin 4号
urlpatterns = patterns('',
    url(r'^show/shouye/$','blog.views.index',{'template_name':'index.html'}),
    url(r'^show/zhengzhi/$','blog.views.index',{'template_name':'zhengzhi.html'}),
    url(r'^show/jingji/$','blog.views.index',{'template_name':'jingji.html'}),
    url(r'^show/zhengzhi/(\d{1,5})/$','blog.views.show'),
    url(r'^admin/', include(admin.site.urls)),      #admin 5号
)


配置templates之base模板

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title></title>
<style>
	#main{
		border:1px solid black;
		margin: 20px auto;
		background-color: red;
		width: 80%;
	}
	#footer{
		clear: both;
		border:1px solid black;
		text-align: center;	
	}
	#left{
		width:20%;
		float: left;
		padding: 20px;
	}
	#right{
		width:50%;
		float: right;
	}
</style>
</head>
<body>
<div id="main">
	<div id="nav">
	{% block nav %}
		<a href='/show/shouye/index.html'>首页</a>
		<a href='/show/zhengzhi/index.html'>政治</a>
		<a href='/show/jingji/index.html'>经济</a>
	{% endblock %}
	</div>
	<div id="left">{% block left %}{% endblock %}</div>
	<div id="right">{% block right %}{% endblock %}</div>
	<div id="footer">{%block footer%}footer{%endblock%}</div>
</div>
</body>
</html>


配置tmplates之Zheng模板

{% extends 'base.html' %}

{% block left %}
{% for n in news %}
<li>
<a href=/blog_article/"/show/zhengzhi/{{n.id}}" >{{n.title}}</a>
</li>
{%endfor%}
{% endblock %}

{% block right %}
{{new.content|default:news.0.content}}
{% endblock %}

这时候,就可以进入后台了,进行图形数据操作。

如果急着在中期就进入后台的话,请先把5个admin配置好

目前位置,页面也都可以访问了,另外两个页面略




作者:forgetbook 发表于2013-1-8 15:00:04 原文链接
阅读:20 评论:0 查看评论

    
[3]connect to MySQL 10061 grant
    来源: 互联网  发布时间: 2013-11-10

在ubuntu下安装了mysql数据库,用Navicat客户端不能链接上,报如下错误error:ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)

1)服务器上mysql -uroot -p123456 查询可以登录

2)ping OK

3)服务器上 mysql grant 外部权限 grant all privileges on *.* to 'root'@'%' identified by '123456'; flush privileges;进行授权

4)数据库配置my.cnt  注释掉skip。。。 和 bing 上服务器地址,原理是127.0.0.1

5)/etc/init.d/mysql restart

 

//Navicat 8.2.12 ,  MySQL GUI Tools 5.0

作者:sflsgfs 发表于2013-1-8 14:54:53 原文链接
阅读:41 评论:0 查看评论

    
最新技术文章:
▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类
▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源
▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机 iis7站长之家
▪运行skyeye缺少libbfd-2.18.50.0.2.20071001.so问题    ▪sharepoint 2010 使用sharepoint脚本STSNavigate方法实...    ▪让javascript显原型!
▪kohana基本安装配置    ▪MVVM开发模式实例解析    ▪sharepoint 2010 设置pdf文件在浏览器中访问
▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
▪优化后的冒泡排序算法    ▪elasticsearch RESTful搜索引擎-(java jest 使用[入门])...    ▪MyEclipse下安装SVN插件SubEclipse的方法
▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
▪Deep Copy VS Shallow Copy    ▪iphone游戏开发之cocos2d (七) 自定义精灵类,实...    ▪100个windows平台C++开发错误之八编程
▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
▪【D3D11游戏编程】学习笔记十八:模板缓冲区...    ▪codeforces 70D 动态凸包    ▪c++编程风格----读书笔记(2)
▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
▪markdown    ▪[设计模式]总结    ▪网站用户行为分析在用户市场领域的应用
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3