StringManager 와 단일 모드
7252 단어 디자인 모드
tomcat 와 같은 Servlet 용기, 이상 메 시 지 는 시스템 관리자 나 프로그래머 에 게 매우 중요 합 니 다.관리 자 는 이상 한 메 시 지 를 통 해 오 류 를 빠르게 찾 을 수 있 습 니 다.프로그램 이상 에 대해 tomcat 는 이상 메 시 지 를 ServletException 에 봉 하여 프로그래머 Servlet 의 오 류 를 알 립 니 다.
Tomcat 은 이러한 이상 한 소식 을 어떻게 관리 합 니까?첫 번 째 로 제외 해 야 할 것 은 하 드 인 코딩 이 코드 에 있다 는 것 이다.이것 은 매우 규범 에 맞지 않 는 방법 으로 매번 메 시 지 를 편집 할 때마다 코드 를 다시 컴 파일 해 야 하기 때문에 매우 번거롭다.Tomcat 은 이 메 시 지 를 properties 파일 에 저장 하여 편집 하기 편리 합 니 다.또한 자바 의 ResourceBundle 류 를 이용 하여 국제 화 를 편리 하 게 실현 할 수 있 습 니 다. tomcat 는 매우 광범 위 한 Servlet 용 기 를 사용 하 는 것 을 알 아야 합 니 다.그러나 tomcat 의 핵심 가방 은 수백 가지 가 있 습 니 다. 이러한 종류의 이상 한 정 보 를 properties 파일 에 저장 하면 유지 보수 에 악몽 을 가 져 올 수 있 습 니 다.
Tomcat 의 방법 은 하나의 패키지 가 하나의 properties 파일 을 공유 하 는 것 입 니 다. 만약 여러분 의 기계 에 tomcat 가 설치 되 어 있다 면% TOMCAT 를 열 수 있 습 니 다.HOME% / server / lib 의 catalina. jar (tomcat 의 가장 핵심 적 인 가방, catalina 는 tomcat 의 코드) 를 보면 기본적으로 모든 가방 에 LocalString. properties 파일 이 들 어 있 는 것 을 발견 할 수 있 습 니 다. 예 를 들 어 org. apache. core 는 바로 이 파일 들 로 tomcat 에 필요 한 이상 정 보 를 저장 합 니 다.
StringManager 는 이러한 이상 한 메 시 지 를 처리 하기 위 한 helper class 입 니 다. 가방 의 어떤 종류 가 이상 한 메 시 지 를 사용 해 야 할 때 StringManager 를 예화 한 다음 getString (String key) 방법 을 호출 할 수 있 습 니 다.
예 를 들 어 sm. getString ("httpConnector. alreadyInitialized"),
위의 문 구 는 "HTTP connector has already been initialized" 를 되 돌려 줍 니 다.
만약 당신 에 게 LocalStrings 가 있다 면CN. properties 파일 은 해당 중국어 메 시 지 를 되 돌려 줍 니 다.
그러나 각 클래스 가 하나의 StringManager 대상 을 실례 화하 면 이 대상 에 포 함 된 이상 한 메시지 가 똑 같 고 자원 의 낭 비 를 가 져 올 수 있 습 니 다.모든 가방 의 클래스 가 하나의 StringManager 대상 을 공유 하면 효율 이 크게 향상 된다.그 걸 어떻게 해?여기까지 읽 으 면 디자인 패턴 을 잘 아 시 는 분 들 은 다 생각 하 실 거 라 고 믿 습 니 다. 맞 아, 바로 단일 모드 야.
일례
단일 모드 는 대상 의 생 성 모드 로 하나의 인 스 턴 스 만 있 고 자체 적 으로 예화 되 어 전체 시스템 에 이 인 스 턴 스 를 제공 합 니 다.
/**
*
* @author linhai
*/
public class Singleton {
//
private static Singleton instance;
//
private Singleton(){}
//
public static Singleton getInstance()
{
if(instance==null)
{
instance=new Singleton();
}
return instance;
}
}
위의 코드 는 바로 단일 모드 의 전형 적 인 예제 이다.단일 사례 의 요점 은 두 가지 가 있 습 니 다. 하 나 는 민영화 구조 함수 입 니 다. 그러면 다른 종 류 는 실행 할 수 없습니다. 단일 사례 를 보장 합 니 다. 두 번 째 는 정적 인 공장 방법 을 제공 하고 자신의 인 스 턴 스 를 되 돌려 클 라 이언 트 를 호출 하 는 것 입 니 다. Singleton instance = Singleton. getInstance ().
StringManager
단일 모드 를 알 게 되 었 습 니 다. 가방 하 나 를 실현 하려 면 StringManager 대상 만 있 으 면 간단 합 니 다. 하나의 Map (tomcat 는 HashTable) 을 사용 하여 가방 이름 을 key 로 하고 StringManager 인 스 턴 스 를 value 로 할 수 있 습 니 다.
package com.scnulh.catalina.util;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
public class StringManager {
/**
* ResourceBundle , tomcat
*/
private ResourceBundle bundle;
/**
* StringManager Map, key,value StringManager
*/
private static Map<String, StringManager> stringManagers=
new HashMap<String, StringManager>();
/**
*
* @param packageName
*/
private StringManager(String packageName)
{
// LocalStrings, LocalStrings
String baseName=packageName+".LocalStrings";
// ,
bundle=ResourceBundle.getBundle(baseName);
}
/**
* StringManager ,
*
* @param packageName
* @return
*/
public synchronized static StringManager getStringManager(String packageName)
{
// map
StringManager stringManager=stringManagers.get(packageName);
// StringManager , , Map
if(stringManager==null)
{
stringManager=new StringManager(packageName);
stringManagers.put(packageName, stringManager);
}
return stringManager;
}
//============ StringManager ===========
public String getString(String key)
{
//
if(key==null)
{
String msg="key is null";
throw new NullPointerException(msg);
}
String result=null;
try
{
result=bundle.getString(key);
}
catch(MissingResourceException e)
{
result="can not find message with the key "+key;
}
return result;
}
public String getString(String key,Object[] args)
{
String result=null;
String initMessage=getString(key);
try
{
Object[] notNullArgs=args;
for(int i=0;i<args.length;i++)
{
if(args[i]==null)
{
if(notNullArgs==args)
notNullArgs=(Object[])args.clone();
args[i]="null";
}
}
//MessageFormat
result=MessageFormat.format(initMessage, notNullArgs);
}
//
// iae.printStackTrace();
catch(IllegalArgumentException iae)
{
StringBuilder sb=new StringBuilder();
sb.append(initMessage);
for (int i = 0; i < args.length; i++) {
sb.append(" arg[" + i + "]=" + args[i]);
}
result=sb.toString();
}
return result;
}
// ,
public String getString(String key,Object arg)
{
Object[] args=new Object[]{arg};
return getString(key, args);
}
public String getString(String key,Object arg1,Object arg2)
{
Object[] args=new Object[]{arg1,arg2};
return getString(key, args);
}
public String getString(String key,Object arg1,Object arg2,
Object arg3)
{
Object[] args=new Object[]{arg1,arg2,arg3};
return getString(key, args);
}
public String getString(String key,Object arg1,Object arg2,
Object arg3,Object arg4)
{
Object[] args=new Object[]{arg1,arg2,arg3,arg4};
return getString(key, args);
}
public static void main(String[] args)
{
StringManager stringManager=
StringManager.getStringManager("ex03.pyrmont.connector.http");
String string=stringManager.getString("httpConnector.alreadyInitialized");
System.out.println(string);
string=stringManager.getString("httpConnector.anAddress", "192.165.23.26",12);
System.out.println(string);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.