Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java模型对象设计_Java_Object_Model_Effective Java - Fatal编程技术网

Java模型对象设计

Java模型对象设计,java,object,model,effective-java,Java,Object,Model,Effective Java,所以我一直在读一些有效的Java!书中最鼓舞人心的部分之一是Immutable Object/Builder部分,Bloch在其中写的是“Builder”类,而不仅仅是Pojo 注意:我在这里谈论的是模型对象:例如一篇文章或一辆汽车 我以前就是这样写这些对象的: public class Car { private String name; public void setName(String name) { this.name = name;

所以我一直在读一些有效的Java!书中最鼓舞人心的部分之一是Immutable Object/Builder部分,Bloch在其中写的是“Builder”类,而不仅仅是Pojo

注意:我在这里谈论的是模型对象:例如一篇文章或一辆汽车

我以前就是这样写这些对象的:

public class Car {

     private String name;

     public void setName(String name) {
         this.name = name;
     }

     public String getName() {
         return name;
     }
}
现在,正如您所看到的,这种设计在许多方面存在缺陷,它需要可变性,您必须首先使用构造函数构造对象,然后设置名称

当然,现在您可以将
name
字段设为final,并将其用作构造函数中的参数,但是如果您有一个大型对象,例如许多SQL表,那么您将有一个丑陋的构造函数,如下所示:

public Car(int horsepowers, String name, String brand, int yearManufactured,
    User owner, List<User> previousOwners) {
    //Set the values
}
现在这给了我们不变性!如果您有一些不是基本的或不可变的对象,只需在
Builder
的setters中复制它们,然后在
Car
的getter中再次复制它们

但是它非常冗长,如果类足够小,我就一直在使用构造函数参数。 如果一个类需要一个可变字段,只要该类有足够的属性(>4个),我就让该字段可变

另一个问题是,当使用android时,该类有一个例如
位图
,那么您必须返回实际的位图,而不是复制它,因为这相当耗费性能

我见过很多这样的问题,但我似乎找不到一个好答案:这些设计有什么标准吗?它们的设计怎么样?有什么好处/好处

提前谢谢

编辑:

问题是:

构建对象模型的最佳方法是什么?对象模型应该是不可变的,并且具有A)少量字段和B)大量字段?如何处理上述
位图问题和类似问题?使某些字段可变

抱歉说得含糊不清。

这本书是目前设计模式的阿尔法和欧米茄。这不是新的,但它似乎通过了时间的考验

您可以阅读每种设计模式的详细的现实例子,它们如何相互关联,如何以及何时使用它们,以及对每种设计模式的透彻解释。当然,还包括生成器模式

至于回答你的问题,我可以提出我的观点,尽管它们当然不是权威性的

我认为如果你有少量的字段,你可以使用构造函数。例如,它会对7个参数发出警告

但是,如果您确实知道您将很快重构该类,或者必须对其进行扩展,那么我认为构建器模式更好,因为它更容易重构。重构构造函数从来都不是一件有趣的事

如果你有7个以上的参数,我认为构建器要好得多。我在当前的项目中广泛使用它

请注意,通过使用构建器模式,您不会说“好的,我是一个不可变的对象构建器”。你说“好吧,我正在构建参数化对象”。因此,在类中有一组可变字段不是问题。但是,如果将类命名为
ImmutableFooDTO
,然后添加可变字段,则会导致混淆

因此,如果有一组字段不能是可变的,那么将它们标记为final,并使用构造函数/生成器为可变字段提供setter。

我将其作为“答案”输入,因此我有空间解释,但这实际上只是对Adam Aroid启动的线程的注释

Johan,首先我假设您正在讨论有效Java中的第2项

注意,这里展示的是Adam Aroid提到的一种构建器模式。Josh Bloch在用有效的Java展示代码之前直接提到了这一点:“这是构建器模式的一种形式[Gamma95,第97页]。(见第13页)。他后来提到了一种使用另一种模式的方法(来自同一本书):“一个已经设置了参数的构建器可以创建一个很好的抽象工厂[Gamma95,第87页]

Johan,你问的问题太宽泛了。我认为最好的答案是Adam Aroid的答案。这需要一些研究,然后应用这些研究来获得一些经验。设计模式书中的讨论极大地促进了这一点。我将投票支持Adam的答案。

尝试以下代码:

 public static boolean isEmailValid(String email) {

    boolean isValid = false;

    String expression = "^[\\w\\.-]+@([\\w\\-]+\\.)+[A-Z]{2,4}$";
    CharSequence inputStr = email;

    Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(inputStr);
    if (matcher.matches()) {
        isValid = true;
    }
    return isValid;
}

我认为
Builder
的意义在于,当您处理带有一些必填字段和可选字段的不可变对象时。因为您会将字段声明为
final
。因此它并不适用于所有设计。嗨!是的,我读过一篇与Java等效的文章,但这就是Builder模式,正如您所看到的那样,它的约束性稍微低一些。它实际上并不适用于所有设计回答这个问题。但是谢谢你的回答。请再看看你的问题:“这些设计有什么标准吗?它们的设计怎么样?”?有什么好处/好处?“我已经回答了你的问题。我没有看到任何其他的问号。嗨,是的,我知道这个问题,我感谢你的回答。但这里的问题是何时使用哪个模型:上面解释的构建器或构造函数参数,如何处理不可变/可变字段等等。我不能接受你的回答,因为你链接到一本书,这本书本身就是行业“标准”,但仍然没有涵盖我在这里的评论和我在上面的问题中提到的所有方面。我认为要么我的理解不完美,要么你的问题有点模糊。我看不出你到底有什么问题。你说的话为他们提供了解决方案。确切的问题是什么?我会更新这个问题,是的,我想这个问题有点模糊,谢谢你指出。你的回答和帖子所有者的问题有关系吗?请帮助Stackoverflow为开发者维护好的内容。
 public static boolean isEmailValid(String email) {

    boolean isValid = false;

    String expression = "^[\\w\\.-]+@([\\w\\-]+\\.)+[A-Z]{2,4}$";
    CharSequence inputStr = email;

    Pattern pattern = Pattern.compile(expression, Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(inputStr);
    if (matcher.matches()) {
        isValid = true;
    }
    return isValid;
}