Java程序員的日常 —— 工作一天的收獲


看題目可能是扯皮,其實還是有很多專業知識的。從最開始沒有注意到設計原則,到后面的jquery實戰技巧,都是今天一天碰到的問題。
每天整理一點點,每天收獲一點點。

關於軟件設計

在設計系統結構的時候,一些軟件設計方法,還是很重要的。

比如開閉原則,開閉原則就是:

  • 對擴展是開放的
  • 對修改是關閉的

要做到上面兩點,就需要在設計應用架構時,理清核心的需求點。完成一個解決問題需求的最小的、最核心的設計結構。其他的業務邏輯或者應用需求,應該都是基於這個核心結構進行擴展。

再來說說軟件設計的6大原則:

  • 開閉原則:即擴展式開放的;修改是關閉的。
  • 單一職責原則:避免職責擴散,每個類都應該僅完成一個功能
  • 里氏代換原則:子類可以擴展父類的功能,但是不能改變父類原有的功能
  • 依賴倒置原則:解耦高層次與低層次實現的關系,采用接口之類的方法進行解耦
  • 接口隔離原則:客戶端不應該實現不需要的接口方法
  • 迪米特法則:對象之間盡量保持最少的依賴關系

這幾種法則,還得慢慢悟啊~

關於Java

在Java類中獲取當前CLASS的路徑

背景

核心包依賴於一個service,我通過Spring的方法獲取到Spring mvc中的上下文,然后拿到bean。

public class BeanUtil {

	/**
	 * 獲取當前web應用的spring上下文對象
	 * @return
	 */
	public static ApplicationContext getWebApplicationContext(){
		return ContextLoader.getCurrentWebApplicationContext();
	}
	
	/**
	 * 根據bean的id獲取bean對象。
	 * @param beanId bean的id
	 * @return Object
	 */
	public static Object getBean(String beanId){
		if (isEmpty(beanId)){
			return null;
		}
		WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();  
		return wac.getBean(beanId);
	}

	private static boolean isEmpty(String beanId) {
		return beanId == null || beanId.trim().equals("");
	}	
}

由於設計上要求解耦核心包與運行時的依賴關系,所以不能使用這種方式。

於是就把service改造成了單例工廠,問題來了...單例工廠依賴於運行時的目錄!這個目錄是通過spring mvc獲得的!這下難住我了...

試了一些方法:

System.getProperty("user.dir")

上面獲取到的是JRE的目錄,無法滿足需求。

XXX.class.getClassLoader().getResource(File.separator.toString())

通過上面的方法就可以回去當前類編譯出來的class的路徑,通過這種方式也可以獲得web容器發布后的地址。

String path = this.getClass().getClassLoader().getResource(File.separator.toString()).getPath();

Java中的回調

在Java中,其實也可以實現回調,不過就是傳入一個接口而已!

interface ICallBack{
	void run();
}
class CallBackClass implements ICallBack{
	public void run(){
		System.out.println(System.currentTimeMillis() );
	}
}
class Controller{
	public ICallBack CallBackObject = null;// 引用回調對象
	Scanner input = new Scanner(System.in); //讀取命令行輸入
	public Controller(ICallBack obj){
		this.CallBackObject = obj;
	}
	public void Begin(){
		while(input.next() != null){
			CallBackObject.run();
		}
	}
}
public class Callback{
	public static void main(String[] args) {
		Controller obj = new Controller(new CallBackClass());
		obj.Begin();
	}
}

關於靜態塊引起的BUG

說來也巧,昨天剛看過《編程思想》,包含靜態塊的類加載的步驟,今天剛好遇到了這個問題。

簡單描述下問題背景

我們在Java應用中需要使用嵌入式的Jruby,這樣就需要啟動ScriptContainer來編譯ruby。而ScriptContainer在JVM只會維護一份,在我們的代碼中是這樣的:

static{
	scriptContainer = new ScriptContainer();
}

由於之前使用Spring的上下文進行初始化,它會在web容器啟動時就執行。后來改成單例工廠,就沒有觸發scriptContainer的初始化。

靜態塊在沒有任何觸發類加載的情況下,是不會執行。只有當你創建一個類的對象,或者訪問了類的靜態內容,才會觸發。

因此投機取巧的使用下面這種方式就解決了問題:

//在類中添加靜態變量
class XXX{
	public static String a = "";
	static{
		//todo
	}
}
//然后在容器初始化時執行:
XXX.a = "a";

關於Jquery

一般在使用JQuery的時候都會使用到大量的DOM操作,此時就容易出現各種性能問題。

減少DOM重繪

如果遇到大量的創建對象,應該減少DOM的重繪:

a.append(xxx);
a.append(xxx);
a.append(xxx);
a.append(xxx);
a.append(xxx);
a.append(xxx);

應該改成:

var html = xxx+xxx+xxx+xxx+xxx;
a.append(xxx);

使用事件捕獲,避免大量的事件綁定

如果你有一個表格,表格會動態創建一些內容,那么如何為這些內容添加事件呢?
可以采用事件的機制:

$("#tableId").click(function(event){
	var target = $(event.target);//包裝成Jquery對象
		
	if(event.target.nodeName === "TR"){//驗證是否是點擊到了某一行
			//上面的校驗方法不是很好,如果有其他更優美的方式,可以留言哈!
	}
});

jquery驗證、移除、添加class

$xxx.hasClass("classname");
$xxx.removeClass("classname");
$xxx.addClass("classname");

jquery添加CSS樣式

$xxx.css("width","250px");

自適應高度的輸入框

當你輸入內容時,會自動計算高度:

//首先是html
<textarea class="form-control"  id="textid"   style="height:500px;" onpropertychange="this.style.height = this.scrollHeight + 'px';"  oninput="this.style.height = this.scrollHeight + 'px';"></textarea>

//然后是script
$textid = $("#textid");
$textid.change(function(){
	$textid= $.parseJSON($textid.val());
	$textid.css("height",$textid.scrollHeight+10+"px");
});


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM