Questions tagged «java»

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

5
ORM是否启用富域模型的创建?
在我的大多数项目中使用Hibernate大约8年之后,我进入了一家不鼓励使用Hibernate并希望应用程序仅通过存储过程与DB进行交互的公司。 在执行了几周之后,我无法为我将开始构建的应用程序创建丰富的域模型,并且该应用程序看起来像(可怕的)事务脚本。 我发现的一些问题是: 由于存储过程仅加载最少的数据,因此无法导航对象图,这意味着有时我们具有具有不同字段的相似对象。一个示例是:我们有一个存储过程来从客户那里检索所有数据,另一个存储过程是从客户那里检索帐户信息以及一些字段。 许多逻辑最终出现在帮助器类中,因此代码变得更加结构化(实体用作旧的C结构)。 令人讨厌的脚手架代码,因为没有框架可以从存储过程中提取结果集并将其放入实体中。 我的问题是: 有没有人遇到过类似情况,并且不同意存储过程方法?你做了什么? 使用存储过程有实际好处吗?除了“没有人可以发布弃用表”这一愚蠢的观点之外。 有没有一种使用存储过程来创建富域的方法?我知道有可能使用AOP将DAO /存储库注入到实体中,从而能够导航对象图。我不喜欢这个选项,因为它非常接近伏都教。 结论 首先,谢谢大家的回答。我得出的结论是,ORM无法启用Rich Domain模型的创建(如某些人所述),但是它确实简化了(通常是重复的)工作量。以下是对结论的更详细说明,但并不基于任何硬数据。 大多数应用程序请求并将信息发送到其他系统。为此,我们在模型术语(例如,业务事件)中创建抽象,然后域模型发送或接收事件。事件通常需要来自模型的一小部分信息,而不是整个模型。例如,在一家网上商店中,支付网关会向用户收取一些用户信息和总计费用,但不需要购买历史记录,可用产品和所有客户群。因此,该事件具有少量特定的数据集。 如果我们将应用程序的数据库作为外部系统,则需要创建一个抽象,以允许我们将域模型实体映射到数据库(如NimChimpsky所述,使用数据映射器)。明显的区别是,现在我们需要为每个模型实体手工映射到数据库(旧模式或存储过程),而且还有一个痛苦,因为两个实体不同步,所以一个域实体可能会部分映射数据库实体(例如,仅包含用户名和密码的UserCredentials类映射到具有其他列的Users表),或者一个域模型实体可能映射到多个数据库实体(例如,如果存在一对一一张表上的映射,但我们只想将所有数据归为一类)。 在只有几个实体的应用程序中,如果不需要横向实体,那么额外的工作量可能很小,但是当有条件需要横向实体时,额外的工作量就会增加(因此,我们可能想实现某种“懒惰”正在加载”)。随着应用程序具有更多实体的发展,这项工作只会增加(我感觉它会非线性地增加)。我在这里的假设是,我们不会尝试重塑ORM。 将数据库视为外部系统的一个好处是,我们可以围绕以下情况编写代码:需要运行两种不同版本的应用程序,其中每个应用程序都有不同的映射。在连续交付生产的情况下,这变得更加有趣……但是我认为ORM在较小程度上也是可行的。 我将不考虑安全性,因为开发人员即使没有访问数据库的权限,也可以通过注入恶意代码来获取存储在系统中的大部分(即使不是全部)信息。我不敢相信我忘了删除记录客户信用卡详细信息的行,亲爱的上帝!)。 小更新(6/6/2012) 存储过程(至少在Oracle中)阻止执行诸如零停机时间连续交付之类的操作,因为对表结构的任何更改都将使过程和触发器无效。因此,在更新数据库期间,应用程序也将关闭。Oracle 为这种称为基于版本的重新定义提供了解决方案,但是我向该功能询问过的少数DBA提到,该功能实施得很差,他们不会将其放入生产数据库中。

11
处理Java中null的最佳方法?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我有一些由于NullPointerException而失败的代码。在不存在该对象的对象上调用一个方法。 但是,这导致我考虑了解决此问题的最佳方法。我是否总是对空值进行防御性编码,以便将来为空指针异常证明代码,还是应该修复空值的原因,以免它在下游发生。 你怎么看?
21 java  null 

11
您使用哪个持续集成框架,为什么?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 有很多不同的持续集成(CI)框架,我想知道哪种框架最受欢迎。您在您所在的公司使用了哪些框架? 是否有任何理由使一个CI框架比其他CI框架更受欢迎-也许与它提供的功能,集成到其中的东西有关? 似乎在Java和.net世界中使用持续集成比使用ruby或python要多。为什么是这样?

9
如何为新程序员讲授异常处理?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 您如何向程序员讲授异常处理。轻松教授所有其他内容-数据结构,ASP.NET,WinForms,WPF,WCF-您可以轻松地讲授所有内容。 使用异常处理,最终对它们进行尝试尝试只是异常处理的语法性质。 但是,应该教的是-您将代码的哪一部分放在try块中?你在赶路区做什么? 让我用一个例子来说明。 您正在处理Windows Forms Project(一个小型​​实用程序),并且已按照以下3个不同的项目进行了设计。 UILayer 业务层 数据层 如果在DataLayer上引发了异常(让我们说加载XDocument会引发异常)(UILayer调用BusinessLayer,而BusinessLayer依次调用DataLayer),您是否只需执行以下操作 //In DataLayer try { XDocument xd_XmlDocument = XDocument.Load("systems.xml"); } catch(Exception ex) { throw ex; } 哪些再次在BusinessLayer中引发,哪些在UILayer中捕获,在那里我将其写入日志文件? 这是您进行异常处理的方式吗?

6
有效的try / catch块用法?
应该使用catch块来编写逻辑,即处理流控制等吗?还是仅仅为了抛出异常?它会影响代码的效率或可维护性吗? 在catch块中写逻辑有什么副作用(如果有)? 编辑: 我见过一个Java SDK类,其中他们在catch块内编写了逻辑。例如(摘录自java.lang.Integer课堂): try { result = Integer.valueOf(nm.substring(index), radix); result = negative ? new Integer(-result.intValue()) : result; } catch (NumberFormatException e) { String constant = negative ? new String("-" + nm.substring(index)) : nm.substring(index); result = Integer.valueOf(constant, radix); } 编辑2: 我正在阅读一个教程,他们将其视为在异常内编写例外情况逻辑的优势: 异常使您能够编写代码的主要流程,并处理其他地方的特殊情况。 有什么具体准则,何时在catch块中编写逻辑,何时不编写逻辑?

2
处理程序,管理器和控制器之间的区别
命名类“ Handler”,“ Manager”或“ Controller”之间有什么区别吗?IE: ,PurchaseManager,。PurchaseHandlerPurchaseController 这些充分表达了相同的含义,还是它们之间有明显的区别? 如果没有与语言无关的答案,请考虑将Java作为语言。
21 java  naming 

2
为什么包和模块是Java 9中的独立概念?
Java 9除了软件包外还将具有模块。通常,语言有其中一种。大多数程序员将两个术语视为同义词。模块建立在包的顶部,将它们视为原语。复合模式建议对原始体和复合体进行统一处理。否则会发生不好的事情。例如,看一下Valhalla项目,他们尝试在其中尝试为基元(值)和引用类型改造通用超类型。 模块和包代表语义上独立的概念吗?这意味着对于任何一种语言都应同时使用(关注点分离)。还是Java必须兼具两者才能向后兼容? 为什么要引入新概念而不是增加现有概念? JSR 376:在Jigsaw项目中实现的“ Java平台模块系统” 。 根据SOTMS 模块是一个命名的,自描述的代码和数据集合。它的代码被组织为一组包含类型(即Java类和接口)的软件包。其数据包括资源和其他种类的静态信息。 JLS小心地避免定义什么是包。来自维基百科: Java软件包是一种将Java类组织到类似于Modula模块的名称空间中的技术,以Java提供模块化编程。 我知道引用Wikipedia是一种不好的做法,但它反映了大家的共识。从模块化编程入门: 有时使用术语包而不是模块(如Dart,Go或Java)。在其他实施方式中,这是一个独特的概念。在Python中,程序包是模块的集合,而在即将到来的Java 9中,计划引入新的模块概念(具有增强的访问控制的程序包的集合)。


5
为什么将类型与生成器结合在一起?
我最近在Code Review上删除了我的一个Java答案,它的开始是这样的: private Person(PersonBuilder builder) { 停止。红色标志。一个PersonBuilder将建立一个Person;它知道一个人。Person类应该对PersonBuilder一无所知-这只是一个不可变的类型。您已经在此处创建了圆形耦合,其中A取决于B,而B取决于A。 该人员应仅获取其参数;愿意创建一个人而不创建它的客户应该能够做到这一点。 我被选票打了耳光,并告诉我(引用)红旗,为什么?这里的实现与Joshua Bloch在其“ Effective Java”书(项目2)中演示的形状相同。 因此,看来在Java 中实现构建器模式的一种正确方法是使构建器成为嵌套类型(尽管这不是这个问题),然后制造产品(正在构建的对象的类) )对构建器的依赖,如下所示: private StreetMap(Builder builder) { // Required parameters origin = builder.origin; destination = builder.destination; // Optional parameters waterColor = builder.waterColor; landColor = builder.landColor; highTrafficColor = builder.highTrafficColor; mediumTrafficColor = builder.mediumTrafficColor; lowTrafficColor = builder.lowTrafficColor; } https://zh.wikipedia.org/wiki/Builder_pattern#Java_example 对于相同的Builder模式,相同的Wikipedia页面对于C#具有非常不同的实现(并且更加灵活): //Represents …

3
为什么Java / Linux堆栈无法“实时”运行的原因是什么?
我经常听到开发人员提的是Java的不能“ 做实时 ”,这意味着在Linux上运行的Java应用程序不能满足一个确定性的实时系统的要求,如对RIOT-OS等运行的东西 我试图理解为什么。我的SWAG告诉我,这可能主要是由于Java的Garbage Collector可以在任何时间运行并完全暂停系统。而且,尽管那里有所谓的“无暂停GC”,但我不一定相信他们的广告,也没有每个JVM实例$ 80K的兴趣来支持这个业余项目! 我还阅读了有关在Linux上运行无人机软件的文章。在那篇文章中,作者描述了Linux几乎导致无人机撞车的情况: 在选择在Pi上执行低级控制循环(PID)之后,我学到了很难的一课-为了变得聪明,我决定在循环的中间放置一个日志记录以进行调试-Quad最初运行良好,但随后Linux决定花2秒写一个日志条目,然后四边形几乎撞到了我的车上! 现在,尽管那个作者用C ++编写了无人机软件,但我可以想象,在Linux上运行的Java应用程序可能遭受同样的命运。 根据维基百科: 如果一个操作的总正确性不仅取决于它的逻辑正确性,还取决于它执行的时间,那么该系统就是实时的。 所以对我来说,这意味着“ 如果完全正确需要逻辑上的正确性和及时性,那么您就不会实时。 ” 假设我已经编写了一个Java应用程序以使其具有超强的性能,可以这么说,我已经“挤满了柠檬”,并且不能合理地用Java编写该程序以使其更快。 总而言之,我的问题是:我正在寻找可以向我解释所有/大多数运行Linux的Java应用程序无法成为“实时应用程序”的原因。意思是,什么使Java / Linux堆栈上的所有事物类别阻止了它“及时”,从而使其“ 完全正确 ”?如前所述,GC和Linux日志刷新似乎可以暂停执行,但是我敢肯定Java应用程序本身之外还有更多事情会导致计时/性能下降,并使其难以满足最终期限的要求。这些是什么?
20 java  linux  real-time 

1
<和有什么区别?扩展了Foo>和<Foo>
我似乎对&lt;Foo&gt;和之间的区别有误解&lt;? extends Foo&gt;。据我了解,如果我们有 ArrayList&lt;Foo&gt; foos = new ArrayList&lt;&gt;(); 这表明Foo可以将类型的对象添加到此数组列表中。由于的子类Foo也是type Foo,因此也可以添加它们而不会出现错误,如下所示 ArrayList&lt;Foo&gt; foos = new ArrayList&lt;&gt;(); foos.add(new Foo()); foos.add(new Bar()); 在哪里Bar extends Foo。 现在,说我定义foos为 ArrayList&lt;? extends Foo&gt; foos = new ArrayList&lt;&gt;(); 我目前的理解是,这表示some unknown type that extends Foo。我的意思是可以将任何属于其子类的对象Foo添加到此列表中。表示ArrayList&lt;Foo&gt;和之间没有区别ArrayList&lt;? extends Foo&gt;。 为了对此进行测试,我尝试编写以下代码 ArrayList&lt;? extends Foo&gt; subFoos = new ArrayList&lt;&gt;(); subFoos.add(new Foo()); subFoos.add(new Bar()); …
20 java  generics 

1
Haskell构建和工件环境类似于Maven
我曾经是Java开发人员很长一段时间,但是最近我加入了Haskell团队。在Java世界中,如果您有一个大型项目,并且有多个团队在工作,那么一种常见的方法是使用工件服务器(例如Maven)来简化和加速开发。许多构建工具(例如Ant,Maven,Gradle)都可以构建项目并将jar文件上传到工件服务器,团队其他成员可以轻松使用。因此,通过将项目拆分为较小的子项目,还可以大大减少构建时间。 在Haskell方面,我们正在使用cabal该项目。我们的项目大约需要10-15分钟才能完成构建,而无需进行优化。如果打开编译器优化,则需要几个小时,这很痛苦。 我想知道,如何才能像在Java中一样做同样的事情。有没有一种简单的方法可以编译软件包(库)的二进制文件并将其上传到工件服务器,并在构建时使用预构建的二进制文件?我知道,因为Haskell生成机器代码(而不是Java中的字节码),所以可能存在兼容性问题,但是对于存储在工件服务器上的不同体系结构/操作系统,我们可能具有不同的二进制文件。

7
除了一连串的if语句或switch之外,还有其他更智能的方法吗?
我正在实现一个接收消息的IRC机器人,并且正在检查该消息以确定要调用的函数。有更聪明的方法吗?在我掌握了20条命令之后,它似乎很快就变得一发不可收拾。 也许有一种更好的抽象方法? public void onMessage(String channel, String sender, String login, String hostname, String message){ if (message.equalsIgnoreCase(".np")){ // TODO: Use Last.fm API to find the now playing } else if (message.toLowerCase().startsWith(".register")) { cmd.registerLastNick(channel, sender, message); } else if (message.toLowerCase().startsWith("give us a countdown")) { cmd.countdown(channel, message); } else if (message.toLowerCase().startsWith("remember am routine")) …

4
如何记录Java程序的高级结构?
背景: 我和我的合作者正在为学术期刊撰写文章。在研究过程中,我们用Java编写了一个仿真程序。我们想让仿真程序免费供其他人使用。我们已决定将代码托管在GitHub存储库上。为了使其他人易于使用,我们希望为程序编写良好的文档,包括: 每个类和方法的Javadocs 如何使用代码 描述代码的高级结构 我的高级问题是: 您能否提供一个可以用来描述程序高级结构的单词和图表的好例子? 这包括作为子问题: 我们如何显示哪些包中包含哪些类? 我们如何显示哪些软件包依赖于其他软件包? 我们如何显示程序中的对象/类如何协同工作? 我们已尝试在代码设计中使用领域驱动的设计原则。我们如何显示域中的对象与编码这些对象的特定源代码文件之间的对应关系?(请参阅下面我对项目的“通用语言”说明。) 到目前为止我做了什么 无处不在的语言 我们将代码的“普遍语言”描述放在文件中ubiquitous-language.md,内容如下。 该项目的目的是研究在不同的提前期模型,报告延迟和需求模型下,补货策略在具有单个设施的简单供应链中的执行情况。 在每个期间,发生以下事件: 如果计划在当前期间将货物运送到工厂,则工厂的库存水平将增加X单位。 如果计划表指示当前期间为报告期,则工厂将向 供应商提交报告。该供应商可能会收到报告 瞬间,或者几个星期的延迟,由指定的时间表。 如果供应商已收到报告,则根据 补货策略,它将计算X单位的补货数量。一个出货的产品的X单位将被安排升周期的筹备时间之后抵达。 客户到达工厂并需要X单位的产品。任何未满足的需求都会丢失。 源代码结构 我们在structure.md下面的文件中放置了不完整的代码“高级”描述。 包装等级结构 在最高级别,源代码分为三个包 com.gly.sfs 该main方法的主类位于此程序包中。 com.gly.sfs.model 域模型类驻留在此程序包中。 com.gly.sfs.util 帮助程序类驻留在此程序包中。

4
空接口以合并多个接口
假设您有两个接口: interface Readable { public void read(); } interface Writable { public void write(); } 在某些情况下,实现对象只能支持其中之一,但在很多情况下,实现将支持两个接口。使用界面的人员将必须执行以下操作: // can't write to it without explicit casting Readable myObject = new MyObject(); // can't read from it without explicit casting Writable myObject = new MyObject(); // tight coupling to actual implementation MyObject myObject …

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.