[英]Using an anonymous class to return values in Java
考慮以下代碼:
public interface MyClass {
public final String getMyObject1();
public final String getMyObject2();
}
public class MyClass1 implements MyClass {
private String myObject1;
private String myObject2;
public MyClass1(String myObject1, String myObject2) {
this.myObject1 = myObject1;
this.myObject2 = myObject2;
}
public String getMyObject1() {
return myObject1;
}
public String getMyObject2() {
return myObject2;
}
}
public interface MyClass2 extends MyClass {
public static MyClass2 newInstance(String myObject1, String myObject2) {
return new MyClass2() {
public String getMyObject1() {
return myObject1;
}
public String getMyObject2() {
return myObject2;
}
};
}
}
我像這樣使用它們
public static void func(MyClass m) {
m.getMyObject1();
m.getMyObject2();
}
func(new MyClass1(o1, o2));
func(MyClass2.newInstance(o1, o2));
我想知道它們之間有什么區別,是否只需要讀取值(即使用MyClass作為傳遞值的“結構”),使用匿名類是否可以是一種更簡單的方法?
否則,退縮是什么?
編程的一個核心規則:盡量不要讓讀者感到驚訝。
您在此處將接口內的靜態類用作“工廠”方法的方法非常令人驚訝(相信我:我已經看過很多 Java代碼)。
如果有的話,處理這種事情的更“常見”的方法是:創建一個名稱稍微相似的靜態類,就像java.lang.Object和java.lang.Objects一樣,它們帶有一些有用的靜態幫助器方法。
除此之外,Java中已經有一個類可以幫助處理任意數量的“命名”值。 這就是所謂的Map
!
最后:對於“ DTO”( 數據傳輸對象 )有一些很好的論據,但尤其是。 對於“初學者”,您應該研究“真正的” OO設計。 基於SOLID原則。 從這個意義上說:設計能夠精確建模您的問題領域的真實類; 並且提供有用的抽象。 具有任意數量成員的結構...不在任何類別中。
這里的問題不是代碼,而是設計。 我很想知道您要在此處設計的實際用例。
當然,第二種方法存在局限性,例如創建類后就無法再更新對象的值,因為您只有一種方法來獲取傳遞的對象的值。
回到設計:
如果接口實現了該接口,則它應該是您的類可以執行的操作。 在您的情況下,您嘗試使用接口中的兩個方法返回兩個實例變量的值,這是一種操作,但它忽略了封裝的基本原理。
如果您的類定義/擁有那些實例變量,則它應該具有該方法的getter和setter方法。 您不需要接口即可執行此操作。 因此,理想情況下,不需要您的界面。 使用MyClass1對象的任何其他類都應直接使用MyClass1的getter和setter。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.