簡體   English   中英

Java:擴展Object類

[英]Java: extending Object class

我正在編寫(好,完成)Java的“擴展”,這將有助於角色編程。
我用javacc將代碼翻譯成Java代碼。 我的編譯器為每個聲明的類添加了一些代碼。 這是一個更清晰的例子:

MyClass extends String implements ObjectWithRoles { //implements... is added
    /*Added by me */
    public setRole(...){...}
    public ...
    /*Ends of stuff added*/
    ...//myClass stuff
}

它為您聲明的每個單一類添加了Implements ..和必要的方法。 相當粗糙,不是嗎?

如果我在一個類中編寫我的方法並且所有類都擴展了那個...但是..如果類已經擴展了另一個類(就像示例那樣)會更好嗎?

我不想創建一種管理角色的包裝器,因為我不希望程序員必須知道的不僅僅是Java,很少有新的保留字及其用法。

我的想法是擴展java.lang.Object ..但你不能。 (對?)
其他想法?

我是新來的,但我關注這個網站,謝謝你的閱讀和你給出的所有答案! (我為英語道歉,我是意大利人)

如果它只是一個“研究”項目,您想要探索這種擴展如何工作,您可以提供自己的Object類實現。 只需復制現有的對象實現,添加setRole方法等,並將-Xbootclasspath:.:/usr/lib/jvm/java-6-sun/jre/lib/rt.jar作為java命令的參數。 (我將尋找API類中.尋找在現實面前rt.jar )。

  • 你可以擴展Object - 每個類都擴展它。
  • 你似乎需要像多重繼承這樣的東西 - 在Java中沒有這樣的東西
  • 如果要添加功能,請使用對象組合。 也就是說,

     YourClass extends Whatever implements ObjectWithRoles { private RoleHandler roleHandler; public RoleHandler getRoleHandler() {..} // defined by the interface } 

然后所有方法都放在RoleHandler

你應該考慮使用組合而不是繼承來解決這個問題; 通過這種方式,您可以提供所需的功能,而無需在繼承中使用“一次性”。

例如,JDK提供了一個類PropertyChangeSupport ,它可用於管理PropertyChangeListener和觸發PropertyChangeEvent 在您希望編寫觸發PropertyChangeEvent的類的情況下,您可以嵌入PropertyChangeSupport實例變量並將所有方法調用委托給它。 避免了對繼承的需要,並且意味着您可以使用新功能補充現有的類層次結構。

public class MyClass extends MySuperClass {
  private final PropertyChangeSupport support;

  public MyClass() {
    this.support = new PropertyChangeSupport(this);
  }

  public void addPropertyChangeListener(PropertyChangeListener l) {
    support.addPropertyChangeListener(l);
  }

  protected void firePropertyChangeEvent() {
    PropertyChangeEvent evt = new ...
    support.firePropertyChangeEvent(evt);
  }
}

如果您正在談論為所有對象添加角色,我還會考慮基於注釋的解決方案。 你可以用@Role(“User”)之類的東西來注釋你的類。 在另一個類中,您可以提取該角色值並使用它。

我認為它需要一個帶有運行時保留的注釋,你可以檢查運行時是否使用反射存在注釋並使用getAnnotation獲取注釋。 我覺得這比自動擴展所有類要清晰得多。

我相信有一些框架完全使用這樣的解決方案,所以應該有一些示例代碼。

如果你正在做你正在做的事情,那么繼承可能不是正確的習慣用法。 您可能需要考慮裝飾器模式,從而構造一個類,該類將其他一些具有較少功能的類作為其參數,並為其添加一些附加功能,將現有類委托給已存在的功能。 如果實現對於許多裝飾器是通用的,您可能需要考慮將該功能放在可以共享的類中,以及可以為所有裝飾器委派的功能。 根據您的需要,雙重調度或反射可能是適當的,以便為各種類制作相似但不完全相同的裝飾器。

此外,正如在注釋中指出的那樣,String被聲明為“final”,因此無法擴展。 因此,您應該考慮一個委托/裝飾對象的解決方案。 例如,您可能有一些包裝字符串的對象,並通過getString()或toString()提供對字符串的訪問,但隨后在String類之上添加了附加功能。

如果您只想將某些對象與其他屬性相關聯,請使用Map (例如HashMap )。

你真正想要做的就是猴子修補 ,即改變現有類的行為而不修改他們的代碼。

不幸的是,Java不支持這一點,也不支持可能使用的mixin 因此,除非你願意轉換到像Groovy這樣更具動態性的語言,否則你將不得不忍受像組合這樣不那么優雅的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM