我有senderA并且senderB都實作sender了單例,并且我有一個SenderWrapper(可能實作了一個ISenderWrapper)類,我想在其中表示SenderA并SenderB作為某種靜態常量。
我正在獲取實體,senderA并在運行時senderB使用Guice。
我SenderWrapper在運行時創建了該類的許多實體(每個請求一個),我想以某種方式在這些類中表示senderA和senderB。我將在SenderWrapper.
我有幾個解決方案:
我有兩個非靜態欄位
senderA,senderB我從建構式傳遞它們。(也許我也可以注入它們,但我擔心性能)我可以為and設定靜態欄位,
senderA并senderB在運行時在Guice模塊中設定它們。但問題是這些欄位不會是 const 并且會發送錯誤訊息,表明它可以在運行時更改。
public class SenderWrapper implements ISenderWrapper {
public static Sender senderA = null;
public static Sender senderB = null;
public void dummyMethod() {
senderA.send(); senderB.send();
}
}
//in Guice module
@Provides
public providesSenderA(){
Sender senderA = new SenderA();
SenderWrapper.senderA = senderA;
return senderA;
}
- 我目前的解決方案是使用一個
Enum類來表示senderA和senderB。就像是
enum Senders {
senderA, senderB
}
我覺得這類似于第 2 點中提到的解決方案,至少在功能上是這樣。我只是討厭使用列舉。
處理這種情況的最佳、最優雅的方法是什么?我不介意重構,某種程度的間接來解決這個問題。
uj5u.com熱心網友回復:
為什么沒有像這樣的 Enum(稍微重命名,所以我們知道它是一個列舉,而不是一個類):
enum SenderType {
SENDER_A, SENDER_B
}
然后讓你的班級是這樣的:
public abstract class SenderBase {
public final SenderType myType;
public SenderBase(SenderType pType) {
myType = pType;
}
// optional getter
public SenderType getType() {
return myType;
}
public void send() {
// here, send myType to socket.
// best is to send myType.name(), because ordinal WILL change when you re-order the enums in their enum class.
// or, if you have different send() implementations for A and B, make this method abstract (and empty, remove body) so you FORCE A and B to implement it.
}
}
和你的類實作是這樣的:
class SenderA extends SenderBase {
public SenderA () {
super(SenderType.SENDER_A);
}
}
class SenderB extends SenderBase {
public SenderB () {
super(SenderType.SENDER_B);
}
}
并通過以下方式構建:
SenderA senderA = new SenderA();
SenderB senderB = new SenderB();
和你的包裝器:
public abstract class SenderWrapper {
public final SenderA mySenderA;
public final SenderB mySenderB;
public SenderWrapper() {
mySenderA = new SenderA();
mySenderB = new SenderB();
}
public void send() {
mySenderA.send();
mySenderB.send();
}
}
實際上,現在我想到了 Wrapper,它甚至可能有一個 (Array)List,您可以在其中添加所有實作,然后對其進行send()迭代。
uj5u.com熱心網友回復:
答案竟然是匿名類。
在我的 Guice 模塊中,我這樣做:
//in Guice module
@Provides
public providesSenderWrapper(final SenderA senderA, final SenderA, senderB){
return new ISenderWrapper {
@Override
public Send() {
senderA.send(); senderB.send();
}
}
}
在類中使用有效常量的巧妙方法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/363117.html
