Tag: 设计

为什么没有必要将方法的返回值赋给变量?

可能重复: 如果您没有引用它,那么Java中的对象会发生什么,例如:myString.concat(“that”) public class ReturnTest { public static void main(String[] args) { ReturnTest rt = new ReturnTest(); rt.show(); } public String show() { return “Hello”; } } 在上面的代码中, show()方法返回一个String值,该值不被任何变量捕获。 编译器和JVM都不会引发任何警告,错误或exception。 原始返回类型也是如此。 为什么? 编译器是否应该确保方法返回的重要值没有丢失? 我怎么能从shell修复这个?

抛出exception来控制流程 – 代码味道?

考虑一下这段代码(特别是Java): public int doSomething() { doA(); try { doB(); } catch (MyException e) { return ERROR; } doC(); return SUCCESS; } doB()定义为: private void doB() throws MyException 基本上, MyException仅在doB()满足某些条件(这不是灾难性的,但确实需要以某种方式提高此条件)的情况下存在,以便doSomething()知道退出时出错。 您是否发现使用exception,在这种情况下控制流量,可以接受? 或者这是代码味道? 如果是这样,你会如何重构这个?

什么是java中的条件变量?

Q1。 什么是Java中的condVar? 如果我看到下面的代码,条件变量是否必须在’ mutex.acquire() ‘和’ mutex.release() ‘块中? public void put(Object x) throws InterruptedException { mutex.acquire(); try { while (count == array.length) notFull.await(); array[putPtr] = x; putPtr = (putPtr + 1) % array.length; ++count; notEmpty.signal(); } finally { mutex.release(); } } 我有三个线程myThreadA , myThreadB , myThreadC运行调用相同的函数commonActivity() ,它触发函数myWorkReport(),例如 public void myWorkReport(){ mutexMyWork.acquire(); try{ while(runMyWork){ doWork(); conditionMyWork.timedwait(sleepMyWork); } […]

设计模式问题涉及N个状态和它们之间的转换

我手边有一个问题,我没有得到使用哪种设计模式。 问题是这样的: 我必须建立一个具有’N’状态的系统,我的系统必须根据某些条件从任何状态转换到任何其他状态。 例如:在条件1下,从状态1移动到3,在条件2上从状态1移动到4。 甚至从一个状态到另一个状态的转换也可以在两个或更多个不同的条件下完成。 例如,可以在以下情况下完成从状态1到状态3的转换: 条件1:“它是一个星期天” 条件2:“下雨” 条件3:“下雨和星期天” 在每种情况下,状态3的处理可以是不同的。 我希望我能够清楚地理解这个问题。 请帮助。 非常感谢

如何在Java 8中实现构建器模式?

我常常发现使用pre-java-8设置实现构建器模式很繁琐。 总是有很多几乎重复的代码。 构建器本身可以被视为样板。 事实上,有代码重复检测器 ,几乎可以考虑使用pre-java-8工具制作的构建器的每个方法作为每个其他方法的副本。 所以考虑下面的类和它的pre-java-8构建器: public class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } public class PersonBuilder { private static […]

选择最低成本的组合

我有不同餐厅的不同项目的数据 Rest Item Price ———————- ABC dosa 14 ABC idly 30 ABC idly+upma 25 123 dosa 30 123 idly 7 123 upma 12 XYZ dosa 20 XYZ idly 12 XYZ upma 20 XYZ dosa+upma 30 XYZ dosa+idly+upma 40 Now I need to pickup a restaurant which gives me the best deal of “dosa+idly+upma” items. 从上面的例子:它将是餐厅“ABC” […]

可变或不可变的类?

我在一些设计书中读到,不可变类提高了可伸缩性,并且尽可能地编写不可变类的良好实践。 但我认为这样不可改变的阶级会增加对象的扩散。 因此,为了提高可伸缩性,继续使用不可变类或更好的静态类(具有所有静态方法的类)是不是很好?

重构访问遗留系统中存储库的域逻辑

我正在使用具有贫血域模型的遗留系统。 域具有以下实体类: Car , CarType , CarComponent , CarComponentType 。 对于其中的每一个,都有一个单独的存储库。 还有许多服务可以访问这些存储库,并且基本上包含所有逻辑。 我需要实现一个方法来确定供应商CarComponentType可以停止CarComponentType 。 逻辑如下:只有当前没有现有汽车的组件才能停止组件。 最初,我在服务类中实现了它。 public boolean canBeDiscontinued(CarComponentType carComponentType) { List cars = carRepository.getCarsWithComponent(carComponentType); return cars.isEmpty(); } 这有效 – 但是这个逻辑在代码中的其他几个地方使用。 它可能会增长,它看起来像是可以放在 CarComponentType类中的东西: public boolean canBeDiscontinued() { List cars = carRepository.getCarsWithComponent(this); return cars.isEmpty(); } 但是,我不能把它放在那里,因为它需要访问存储库(据我所知,它是一个非常严重的反模式,实体要知道数据访问层)。 加载组件类型时,我无法加载该类型的所有汽车,因为这可能是数千个对象。 我们没有使用任何ORM,因此制作延迟加载的集合不仅体积大,而且非常容易出错。 像我第一次在服务类中实际使用此方法更合适吗? 这不重要吗? 还有另一种选择吗? 我应该从另一个起点开始重构吗? 这里有一个类似的问题。 但是我的问题与Java有关,所以我不认为这个解决方案适用于我的情况。 此外,抱歉使用汽车和组件作为我的域模型。 🙂

部分模拟很糟糕,为什么呢?

脚本 我有一个类称为Model ,它表示不同类型的许多其他对象的复杂的复合对象。 您可以将其视为具有Door[] , Tire[] , Engine , Driver等的Car 。而这些对象又具有子对象,例如Engine具有SparkPlug , Clutch , Generator等。 我有一个Metrics类,它可以计算一些或多或少复杂的关于Model指标,实质上它看起来像这样: public class Metrics{ private final Model model; public Metrics(Model aModel){model = aModel;} public double calculateSimpleMetric1(){…} public double calculateSimpleMetric2(){…} public double calculateSimpleMetricN(){…} public double calculateComplexMetric(){ /* Function that uses calls to multiple calculateSimpleMetricX to calculate a more complex metric. */ […]

如何存储实例方法

可能重复: 内存中的Java / C#方法表示 我想知道我是否在java中有一个对象,它是如何存储实例方法的? 对象是否有指向它的实例方法的指针? 例: public class MyObject { private int x; private int y; [..] } 如果我计划在内存中保留这些MyObject的很多(例如一个对象的大树),如果除了x的getter和yi定义计算总和的实例方法,它会在内存方面产生显着差异吗? 我正在尝试理清我应该添加更多实例方法或使用getter和setter在另一个类中进行计算。