Questions tagged «java»

Java是最初由Sun Microsystems开发的高级,独立于平台的,面向对象的编程语言。Java目前归甲骨文所有,甲骨文于2010年收购了Sun。

4
在构造函数中合法的“实际工作”?
我正在设计,但是一直遇到障碍。我有一个特定的类(ModelDef),它实际上是通过解析XML模式(例如DOM)构建的复杂节点树的所有者。我想遵循良好的设计原则(SOLID),并确保生成的系统易于测试。我打算使用DI来将依赖项传递到ModelDef的构造函数中(以便在测试过程中可以根据需要轻松地将其替换掉)。 不过,我正在努力的是创建节点树。该树将完全由简单的“值”对象组成,而这些对象无需独立测试。(但是,我仍然可以将抽象工厂传递到ModelDef中,以帮助创建这些对象。) 但是我一直在读,构造函数不应该做任何实际的工作(例如Flaw:Constructor可以进行实际工作)。如果“实际工作”意味着构造重量较重的相关对象,而以后可能希望将其存根进行测试,则这对我来说非常有意义。(这些应通过DI传递。) 但是像该节点树这样的轻量级对象呢?必须在某个地方创建树,对不对?为什么不通过ModelDef的构造函数(例如使用buildNodeTree()方法)呢? 我真的不想在ModelDef之外创建节点树,然后再通过(通过构造函数DI)将其传递进去,因为通过解析架构来创建节点树需要大量复杂的代码-需要进行彻底测试的代码。我不想将其委托给“胶合”代码(这应该是相对琐碎的,并且可能不会被直接测试)。 我曾考虑过将代码创建节点树放在一个单独的“构建器”对象中,但是犹豫称它为“构建器”,因为它与“构建器模式”并不完全匹配(后者似乎与消除伸缩无关。构造函数)。但是,即使我将其称为其他名称(例如NodeTreeConstructor),也只是为了避免让ModelDef构造函数构建节点树而感到有些破绽。它必须建在某个地方。为什么不在要拥有它的对象中?

4
与将字符串连接在一起并一次调用相比,经常调用println()有多糟糕?
该问题是从Code Review Stack Exchange 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 5年前。 我知道输出到控制台是一项昂贵的操作。出于代码可读性的考虑,有时最好调用一个函数两次输出文本,而不是将一长串文本作为参数。 例如,效率降低多少 System.out.println("Good morning."); System.out.println("Please enter your name"); 与 System.out.println("Good morning.\nPlease enter your name"); 在该示例中,区别仅在于一个呼叫,println()如果更多,该怎么办? 与此相关的是,如果要打印的文本很长,则在查看源代码时,涉及打印文本的语句可能看起来很奇怪。假设文本本身不能简短,该怎么办?是否应该出现多次println()通话的情况?曾经有人告诉我,代码行不应超过80个字符(IIRC),那么您将如何处理 System.out.println("Good morning everyone. I am here today to present you with a very, very lengthy sentence in order to prove a point about how …
23 java  c++  performance  c  io 

6
如何解决嵌套评论的问题
不能嵌套注释的语言不只是一种。您对此问题有很好的解决方案吗?在C / C ++和Java中,一种解决方法是仅使用单行注释,但是注释掉较大的块将变得不可能。我正面临着这样的事情: </li><!-- <li><!-- Save --> 因此,我必须手动浏览并编辑评论。您能以多种语言建议我们应该如何处理吗?我不确定,但是python '''可能为此提供了解决方案,可以#在python中添加注释?`
23 java  c++  python  c  comments 

7
避免过于复杂的方法-循环复杂性
不确定如何使用这种方法来降低环复杂性。声纳报告为13,而预期为10。我敢肯定,保持这种方法不会造成任何危害,不过,这只是挑战我如何遵循Sonar的法则。任何想法将不胜感激。 public static long parseTimeValue(String sValue) { if (sValue == null) { return 0; } try { long millis; if (sValue.endsWith("S")) { millis = new ExtractSecond(sValue).invoke(); } else if (sValue.endsWith("ms")) { millis = new ExtractMillisecond(sValue).invoke(); } else if (sValue.endsWith("s")) { millis = new ExtractInSecond(sValue).invoke(); } else if (sValue.endsWith("m")) { millis …

5
不存储新对象而创建新对象是不好的做法吗?
此问题是从Stack Overflow 迁移而来的,因为可以在Software Engineering Stack Exchange上回答。 迁移 7年前。 我见过用Java代码创建的对象,但没有存储对该对象的引用。例如,在eclipse插件中,我看到了SWT Shell的创建过程,如下所示: new Shell(); 这个新的Shell对象没有存储在变量中,但是将一直保持引用状态,直到处理完该窗口为止(默认情况下,关闭该窗口时会发生[我相信?])。 创建这样的对象而不存储对它们的引用是不好的做法吗?还是图书馆设计不当?如果我不需要引用,而只想要对象的“副作用”怎么办?我是否仍应存储参考? 更新: 诚然,我上面的例子很差。虽然我看到过这样创建的UI元素,但是创建这样的SWT Shell可能毫无意义,因为您需要在Shell实例上调用open方法。有由AIX提供更好的例子,如从以下Java并发教程: (new HelloThread()).start(); 在许多情况下都可以看到这种做法,因此问题仍然存在。这是好习惯吗?
23 java 

11
在Bank world中选择代码设计工作或懒惰
我在一家出色的投资银行工作了两年。 我进行了一些技术项目,希望创建最优化的代码,同时尊重适应的良好设计模式,SOLID原则,demeter规律并避免各种重复的代码... 当生产交付=>零错误时,一切都按预期进行。 但是,大多数开发人员来找我是为了使我的所有代码过于复杂以至于无法理解阅读。我听了一个例子:“做一些if和instanceof,忘记多态性,这样很容易纠正紧急生产错误”。我不想回答…… 知道这些开发人员一点也不好奇,拒绝努力理解一个好的设计(例如,90%的开发人员不知道什么是策略模式,并且编写过程代码,并且从不进行设计,因为他们说,他们很简单) ),我的项目经理告诉我,我对银行世界的看法确实是错误的,而且过于理想化。 你会建议我什么?我要重申的是,我是否真的希望真正好的代码,或者让我适应大多数开发人员,对于我来说,重复设计代码对我而言,这并不是真正有趣的设计代码,而是我们开发人员工作的全部美。 或者相反,他们是否应该学习基本的面向对象原则和最佳实践以适应我的代码?

4
如何显着提高Java性能?
LMAX团队进行了有关如何在不到1毫秒的延迟时间内完成100k TPS的演示。他们通过博客,技术论文(PDF)和源代码本身来备份该演示文稿。 最近,马丁·福勒(Martin Fowler)发表了一篇有关LMAX架构的出色论文,并提到他们现在每秒能够处理600万个订单,并着重介绍了该团队为提高性能而采取的一些步骤。 到目前为止,我已经解释了业务逻辑处理器速度的关键是在内存中按顺序进行所有操作。这样做(并没有真正愚蠢的事情)允许开发人员编写可处理10K TPS的代码。 然后,他们发现专注于良好代码的简单元素可以将其带入100K TPS范围。这只需要精心构造的代码和小的方法-本质上,这使Hotspot可以更好地进行优化,并使CPU在运行代码时更高效地缓存代码。 提升另一个数量级需要更多的技巧。LMAX团队发现有几件有助于实现目标的方法。一种是编写Java集合的自定义实现,这些实现被设计为对缓存友好并且谨慎处理垃圾。 达到最高性能水平的另一种技术是将注意力放在性能测试上。长期以来,我一直注意到人们在谈论提高性能的技术,但是真正起作用的一件事就是对其进行测试 福勒提到发现了几件事情,但他只提到了几件。 是否还有其他架构,库,技术或“事物”有助于达到这样的性能水平?

9
为什么Java / C ++中没有幂运算符?
尽管有这样的运算符- **在Python中,我想知道为什么Java和C ++也没有。 使用运算符重载为用C ++定义的类创建一个对象很容易(而且我相信Java中也可以做到这一点),但是在谈论基本类型(例如int,double等)时,您必须使用库功能类似Math.power(通常必须将两者都强制转换为两倍)。 那么-为什么不为原始类型定义这样的运算符?
23 java  c++  python 

2
命名约定:最终字段(非静态)
今天,我与一位同事讨论了finalJava类中字段的命名。 在他的观点中,final字段也应视为常量,因为其值在创建实例后不会更改。 这将导致以下final字段命名约定: public class Foo { private static final String BLA_BLA = "bla"; private final String BAR_BATZ; ... } 在我看来,只有static final字段应被视为常量,而仅字段应final遵循通常的camelCase命名约定。 public class Foo { private static final String BLA = "bla"; private final String barBatz; ... } 现在我有点不确定,因为他是比我经验丰富的程序员,我通常同意他的观点,并认为他是一个非常好的开发人员。 有什么意见吗?
23 java  naming  final 

5
另一种流行的语言如何在管理与Java / Java EE类似的复杂性时避免使用工厂模式?
工厂模式(或至少使用FactoryFactory..)是许多笑话的对接,例如此处。 除了具有冗长和“创造性”的名称(如RequestProcessorFactoryFactory.RequestProcessorFactory)之外,如果您必须使用Java / C ++进行编程并且有Abstract_factory_pattern的用例,那么工厂模式是否有根本上的错误? 另一种流行的语言(例如Ruby或Scala)如何在管理相似的复杂性时避免使用它呢? 我要问的原因是,在Java / Java EE生态系统的背景下,我看到的大多数批评都是工厂,但它们从未解释其他语言/框架如何解决它们。

1
拆分一个大项目以创建一个多模块Maven项目
我正在开发一个Spring-MVC应用程序,其中我们使用Maven进行依赖项管理。由于项目规模很大,我们正在考虑将项目分为几个部分。我有一些疑问,希望能在这里得到答案。 当前,我们正在ROOT.war服务器上的Apache tomcat上部署单个WAR文件。由于项目规模很大,因此Web应用程序中包括通知和电子邮件,第三方服务,PUSH(Cometd),REST API等组件。目前,它们都是相互依存的,相互依赖。例如,Notification对象也取决于Person对象,因为通知是为用户量身定制的。 拆分大项目的主要目的是能够在单个模块上工作,进行错误修复,添加功能,进行测试等。如果满意,则只能在服务器上替换此模块,而不是整个应用程序。这可能吗? 如前所述,对象之间存在依赖关系和映射。如何在不同的子模块之间进行管理,或者只是将import语句更改为包括其他项目? 如我所说,其目的是在单个模块上工作并能够部署它们(最好是热的)。目前,我们只有一个WAR文件,如ROOT.war。拆分会创建多个war文件,然后将其称为URL domain-name.com/module_name/some_mapping吗? 我目前正在检查文档,但这是我们要使用Maven提供的多模块要实现的主要目标,并且想知道这是否可行。如果需要更多信息,请告诉我。 目前,我正在使用Spring的父POM,如下所示: <parent> <groupId>io.spring.platform</groupId> <artifactId>platform-bom</artifactId> <version>1.1.3.RELEASE</version> <relativePath /> </parent>


5
成功时返回true / false与void的函数,失败时抛出异常
我正在构建一个API,一个上传文件的函数。如果文件上传正确,此函数将不返回任何内容/无效,并且在出现问题时将引发异常。 为什么要例外而不是错误?因为在异常中,我可以指定失败的原因(无连接,文件名丢失,密码错误,文件描述丢失等)。我想构建一个自定义异常(带有一些枚举来帮助API用户处理所有错误)。 这是一个好习惯还是返回一个对象(内部包含布尔值,可选错误消息和错误枚举)更好?

7
“ Set”是否应具有Get方法?
让我们拥有这个C#类(在Java中几乎相同) public class MyClass { public string A {get; set;} public string B {get; set;} public override bool Equals(object obj) { var item = obj as MyClass; if (item == null || this.A == null || item.A == null) { return false; } return this.A.equals(item.A); } public override int GetHashCode() …

4
如何使用单元测试和TDD来测试主要依赖数据库CRUD操作的应用程序?
在工作中,我的项目之一主要是获取从外部客户端传入的数据并将其保存在数据库中。这是一个使用JPA的Java企业应用程序,我们的大多数逻辑都围绕CRUD操作展开。 我们的大多数错误都以一种或另一种方式涉及JPA。 示例1:如果单击保存按钮两次,JPA可能会尝试第二次将同一实体插入数据库,从而导致主键冲突。 示例2:您从数据库中检索一个实体,对其进行编辑,然后尝试更新其数据。JPA可能会尝试创建一个新实例,而不是更新旧实例。 解决方案通常需要添加/删除/更改JPA批注。其他时候,它与修改DAO逻辑有关。 我无法弄清楚如何使用单元测试和TDD对我们的代码充满信心。我不确定这是因为单元测试和TDD不合适,还是我错误地解决了这个问题。 单元测试似乎不合适,因为我只能在运行时发现这些问题,并且需要部署到应用服务器以重现这些问题。通常需要涉及数据库,而我认为这超出了单元测试的定义:这些是集成测试。 TDD似乎不合适,因为部署+测试反馈循环是如此之慢,以至于我效率低下。部署+测试反馈循环需要3分钟以上的时间,这就像我专门针对所编写的代码运行测试一样。要运行所有集成测试,需要30分钟以上的时间。 在此模型之外有代码,我总是尽可能地进行单元测试。但是,我们的大多数错误和最大的时间浪费总是涉及JPA或数据库。 还有另一个类似的问题,但是如果我遵循建议,我将包装代码中最不稳定的部分(JPA)并测试除此以外的所有内容。就我的问题而言,我将处于同样的糟糕境地。打包JPA之后的下一步是什么?海事组织,这个问题(也许)是回答我的问题的步骤,而不是答案。
22 java  unit-testing  tdd  jpa 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.