在一般情況下,有可能做這樣的事情,但我會建議考慮一下。這個實現有點笨拙。
首先,您正在處理優先隊列。這意味着你想要通過優先順序接收添加到它的東西。優先隊列是有序集合。爲了做到這一點,你放入它的物品必須是Comparable
。這就是String或Integer的優先隊列工作的原因。它們都是Comparable
- 如果隊列中有兩個字符串,則很容易判斷哪個字符先出現,因爲字符串具有自然順序。儘管如此,必須說在現實生活中,你通常不會分配字符串優先級。優先隊列應該表示哪些事情處理得更緊急,哪些事情更少。所以通常優先級更可能被實現爲某種數字或枚舉。
因此,除了在隊列中放入函數之外,還需要在將隊列放入隊列時爲其分配優先級,並且這將告知誰正在從隊列中讀取哪些函數更加緊迫。他只會按優先順序排列。
因此,我們需要定義某種物體,將封裝兩種功能:和優先級:
public final class PrioritizedPerformer implements Comparable<PrioritizedPerformer> {
/**
* Actor interface. Represents a way to run a function.
*/
public interface Actor {
void perform();
}
/**
* Available priorities
*/
public enum Priority { URGENT, HIGH, MEDIUM, LOW };
private Priority priority;
private Actor actor;
/**
* Constructor that allows creating PrioritizedPerformer objects with a given priority and actor.
*
* @param priority Priority of this object when placed in a priority queue.
* @param actor Actor representing a function to be performed.
*/
public PrioritizedPerformer(Priority priority, Actor actor) {
// Don't allow null priorities, this will cause problems in priority queues.
if (priority == null) {
throw new IllegalArgumentException("Must provide valid priority");
}
this.priority = priority;
// Don't allow null actors. The action has to be available.
if (actor == null) {
throw new IllegalArgumentException("Must provide valid actor");
}
this.actor = actor;
}
/* Allows prioritizing one PrioritizedPerformer over another.
*
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
@Override
public int compareTo(PrioritizedPerformer o) {
return priority.compareTo(o.priority);
}
/**
* Perform whatever action the actor represents.
*/
public void perform() {
actor.perform();
}
}
現在我們有了這一點,我們可以把這個類型的對象爲優先級隊列:
PriorityQueue<PrioritizedPerformer> queue = new PriorityQueue<PrioritizedPerformer>();
queue.offer(new PrioritizedPerformer(
PrioritizedPerformer.Priority.HIGH,
new PrioritizedPerformer.Actor() {
public void perform() {
login();
}
}));
queue.offer(new PrioritizedPerformer(
PrioritizedPerformer.Priority.LOW,
new PrioritizedPerformer.Actor() {
public void perform() {
quit();
}
}));
queue.offer(new PrioritizedPerformer(
PrioritizedPerformer.Priority.URGENT,
new PrioritizedPerformer.Actor() {
public void perform() {
returnThree();
}
}));
我們在這裏做的是建立各部PrioritizedPerformer
對象與給定Priority
和匿名Actor
執行我們想讓它執行的功能。
現在我們可以運行:
queue.remove().perform();
這會從隊列中刪除優先級最高的對象,並運行其perform()
方法,它調用其內部的Actor
perform()
方法。在這種情況下,它將採用優先級爲URGENT
的驅動程序,該驅動程序恰好運行功能returnThree()
。
所以這將做你所要求的。但我反對它。它只能執行沒有參數的函數(或者僅僅調用具有預定參數的特定函數)。你不能通過它像Math.sqrt
,因爲當你需要執行它時,你無法將數字傳遞給該函數。
這會導致使用全局範圍字段將數據傳遞給各種函數而不是參數。這反過來導致可讀性問題,缺少封裝,這意味着您的參數可能會被您不打算改變它們的方法改變。這是各種各樣的不好。另外,在這個特定的設置中,如果您不知道下一步將運行哪個函數,您將如何知道要在全局範圍中設置哪些參數?
Java不是JavaScript,函數(Java中的「方法」)不是可以分配給變量(甚至是匿名變量)的東西,然後傳遞。編程模型相當不同,所以你可以花一個小時閱讀官方的[Java基礎知識](http://docs.oracle.com/javase/tutorial/java/index.html)。不需要那麼長時間,並且在理解Java可以,不可以,不想做和不可以做的事情方面給你一個很大的提升。 – 2014-11-04 17:52:16
其實java可以做我問的問題,有人確實回答了我的需求(指向最佳答案)謝謝:) – Indigo 2014-11-04 18:00:26
實際上,它不能,你得到的答案是關於創建一個新的Runnable實例,它被調用來運行與調用方法的方式不同。它可以做你想做的事,但你想做的是打破不少Java最佳實踐和約定=) – 2014-11-04 18:02:32