Questions tagged «java»

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


1
测量Java 8代码的条件覆盖范围是否有意义?
我想知道自Java 8出现以来,当前使用Java的工具来衡量条件代码覆盖率是否还没有过时。使用Java 8 Optional,Stream我们通常可以避免代码分支/循环,这使得在不测试所有可能的执行路径的情况下轻松获得很高的条件覆盖率。让我们将旧的Java代码与Java 8代码进行比较: 在Java 8之前: public String getName(User user) { if (user != null) { if (user.getName() != null) { return user.getName(); } } return "unknown"; } 以上方法有3条可能的执行路径。为了获得100%的条件覆盖率,我们需要创建3个单元测试。 Java 8: public String getName(User user) { return Optional.ofNullable(user) .map(User::getName) .orElse("unknown"); } 在这种情况下,分支是隐藏的,我们只需要进行一次测试即可获得100%的覆盖率,无论哪种情况我们都将进行测试。我相信,尽管仍然存在相同的三个逻辑分支。我认为这使有条件覆盖范围统计这些天完全不可信。 测量Java 8代码的条件覆盖范围是否有意义?还有其他工具可以发现未经测试的代码吗?


3
在通常返回集合的地方返回Streams是理智的事情吗?
在开发与任何旧代码无关的API时,我经常发现自己编写的方法纯粹是通过收集结果终止的Streams管道。像这个: ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() { return myPrivateThingies.stream() .map(this::ownerOfThing) .map(Owner::socialStatus) .filter(SocialStatus::isHeAFineMatey) .collect(MyCustomCollectors.toImmutableSet()); } 现在,此类的大多数客户端通常将需要Collection(在本例中为ImmutableSet)来搜索元素并对其进行迭代,但是某些客户端可能会受益于拥有Stream,因此可以在此基础上传递更多的操作流,而无需从集合中获取新的流。因此,返回Stream会给客户提供他们如果拥有Collection便拥有的选项超集(毕竟,他们总是可以collect()自己拥有Stream: Stream<T> deriveSomethingMeaningfulFromPrivateState() { return myPrivateThingies.stream() .map(this::ownerOfthing) .map(Owner::socialStatus) .filter(SocialStatus::isHeAFineMatey); // No collect } 这种方法对我来说很诱人,因为我看不到它可能存在的任何潜在缺陷。但是,我在任何库中都从未见过这种方法(可能是因为Java 8出现后没有发布太多的库),所以我有点害怕采用它。现有的库类通常在从私有状态派生出某些东西时返回Collections。 如果我决定在Java-8之前的我自己会返回Collection的任何地方返回Stream ,会发生什么不好的事情?还是我可能在这里做一些反模式的事情,而这一切都源于私人国家?

4
“使用地图代替类来表示数据” -Rich Hickey
在Clojure创作者Rich Hickey的这段视频中,他建议使用map来表示数据,而不是像Java那样使用类来表示数据。我不明白该怎么做,因为如果API用户将其简单地表示为地图,他们怎么会知道输入键是什么。 范例: PersonAPI { Person addPerson(Person obj); Map<String, Object> addPerson(Map<String, Object> personMap); } 在第二个函数中,API用户如何知道创建人的输入是什么?
19 java  design  class  clojure  map 

8
在Java 7中打开字符串有什么好处?
当我开始用Java编程时,switch语句不带字符串的事实使我感到沮丧。然后,在使用Enums时,我意识到与它们相比,您所获得的好处而不是传递原始值-类型安全性(这使得重构更容易),同时也使其他开发人员更清楚。 我正在努力思考一种情况,在SE7中,我现在决定使用带有字符串而不是Enums作为输入的开关。如果通过打开整个字符串(例如,而不是部分匹配或正则表达式匹配)来实现它们,则似乎并没有提供更少的理由来更改代码。 借助IDE工具和编码的读写比率,我会比传递字符串值更快乐地自动生成一个额外的Enum。 他们作为程序员给我们带来什么好处?更少的样板? 似乎该功能并未让该语言大声疾呼。尽管可能有一个我忽略的用例。

7
模块化编程会影响计算时间吗?
每个人都说我应该使代码模块化,但是如果我使用更多的方法调用而不是更少但更大的方法,效率会降低吗?Java,C或C ++有什么区别? 我知道编辑,阅读和理解起来更容易,尤其是在小组中。那么,与代码整理优势相比,计算时间损失微不足道吗?
19 java  c++  c  efficiency 

4
如何在关系数据库驱动的应用程序中设计不好的数据库中创建更好的OO代码
我正在编写一个Java Web应用程序,该应用程序主要由一堆相似的页面组成,其中每个页面都有多个表和一个适用于这些表的过滤器。这些表上的数据来自SQL数据库。 我将myBatis用作ORM,在我的情况下,这可能不是最佳选择,因为数据库设计不良,而mybatis是面向数据库的工具。 我发现我正在编写很多重复的代码,因为由于数据库的不良设计,我不得不为类似的事情编写不同的查询,因为这些查询可能非常不同。也就是说,我无法轻松地将查询参数化。这会传播到我的代码中,而不是通过一个简单的循环来填充表中列上的行,我将代码改为: 得到一个数据(p1,...,pi); 得到B数据(p1,...,pi); 获得C数据(p1,...,pi); 获得D数据(p1,...,pi); ... 当我们有带有不同列的不同表时,这很快就会爆炸。 这也增加了我使用“ wicket”的复杂性,实际上是将对象映射到页面中的html元素。因此,我的Java代码成为了数据库和前端之间的适配器,这使我创建了许多布线,样板代码,并在其中混入了一些逻辑。 正确的解决方案是在ORM映射器上包裹一个额外层,该额外层为db提供一个更均匀的接口,还是有更好的方法来处理我正在编写的这些意大利面条式代码? 编辑:有关数据库的更多信息 该数据库主要保存电话信息。较差的设计包括: 具有人工ID作为主键的表与域知识无关。 没有唯一,触发器,检查或外键。 具有通用名称的字段,这些字段匹配不同记录的不同概念。 只能通过与其他具有不同条件的表交叉才能分类的记录。 应为数字或日期存储为字符串的列。 综上所述,到处都是凌乱/懒惰的设计。

4
用代码记录数学逻辑
有时,尽管不是经常,但我必须在代码中包含数学逻辑。所使用的概念大多非常简单,但是生成的代码却不是-许多目的不明确的变量,以及某些意图不那么明显的操作。我的意思并不是说代码不可读或不可维护的,只是它的waaaay难度比实际的数学题理解。我尝试评论最难理解的部分,但存在与仅对其进行编码相同的问题- 文本不具有数学的表达能力。 我正在寻找一种更有效且易于理解的方式来解释某些复杂代码(最好是代码本身)背后的逻辑。我考虑过TeX-编写文档并将其与代码分开生成。但是然后我必须学习TeX,并且文档本身也不会包含在代码中。我想到的另一件事是对写在纸/白板上的数学符号,方程式和图表进行拍照,并将其包含在javadoc中。 有没有更简单明了的方法? PS给变量赋予描述性名称(timeOfFirstEvent而不是t1)实际上会使代码更冗长,甚至更难阅读。

6
一种编程语言,允许您为简单类型定义新的限制
许多语言一样C++,C#和Java允许你创建表示简单类型,如对象integer或float。使用类接口,您可以覆盖运算符并执行逻辑,例如检查值是否超过业务规则100。 我想知道在某些语言中是否可以将这些规则定义为变量/属性的注释或属性。 例如,C#您可能会写: [Range(0,100)] public int Price { get; set; } 或者也许C++您可以这样写: int(0,100) x = 0; 我从未见过这样的事情,但是鉴于我们在存储之前对数据验证的依赖程度。奇怪的是,该功能尚未添加到语言中。 您能否举例说明可能的语言?

3
Java中异常的后缀Exception
在异常类上指定Exception的后缀感觉对我来说像是代码的味道(冗余信息-名称的其余部分表示错误状态,并且它继承自Exception)。但是,似乎每个人都这样做,这似乎是一种好习惯。 我想了解为什么这是个好习惯。 我已经阅读并阅读了以下问题:为什么异常通常在类名中带有后缀异常 问题是针对PHP,而响应可能对Java有效。还有其他论点吗?或者真的和区分它们一样简单吗? 如果我们从上一个问题中选取示例,那么java中是否确实存在名称FileNoFound并非例外的类?如果可能的话,是否应该加上后缀Exception? 纵观eclipse的快速层次结构Exception,可以肯定的是,它们中的绝大多数确实有例外后缀,但也有一些例外。javassist是一个库的示例,该库似乎有一些没有后缀的异常-例如BadByteCode,BadHttpRequest等。 BouncyCastle 是另一个lib,但有例外 CompileError 我在Google上搜索的信息也很少。

5
乔达时间vs Java时间
尽管Joda具有丰富的功能,并且比标准Java时间更为复杂,但它不一定总是最好的使用方式。如何确定在任何Java代码中应使用Joda Time还是Java Time? 是否有某种准则可以告诉我们如何根据我们的要求选择合适的准则?
19 java  api  joda-time 

1
如何包括第三方Maven依赖项的许可证?
我正在为我的Java项目生成一个可分发的二进制文件。我以两种方式发布它: Maven中央 可在Google代码上分发的压缩文件 我的项目已获得Apache 2.0许可。我使用少数第三方,其中之一是MIT许可的。我认为有义务根据许可证中的以下文本,使我的项目用户了解许可证的内容: 以上版权声明和本许可声明应包含在本软件的所有副本或大部分内容中。 我如何最好地在我的来源和可分发内容中引用此内容?我目前在想: 我的源文件不需要引用任何内容。它们只是包括我的Apache 2.0样板公告。 我在项目的根目录中添加了LICENSE.txt文件,其中包括Apache 2.0许可证文本。 对于我的压缩可分发文件,我还需要添加一些内容,以表明组件已获得MIT许可。也许是NOTICE文件? 对于我的Maven Central发行版,我不需要做任何事情,因为我的工件只是声明了它的依赖项,而实际上并没有包括它们。 这看起来像是有效的计划吗?如果是这样,任何人都可以建议如何完成第3点。

3
解耦胜过REST中的DRY吗?
我正在构建REST API,以公开现有Java API的大部分功能。这两个API都供我的组织内部使用;我不必为外部使用而设计。我对这两种API都有影响,但是正在实现REST。Java API将继续用于本地应用程序(不会“淘汰”),但是REST API将用于重大的新开发。 一些Java API类只是数据(带有属性,getter,setter的bean)。并且至少其中一些有意义的是通过REST API以某种形式(作为数据(将被编组为XML或JSON))进行传输。例如,一个存储有关服务器计算机信息的类。对于这些数据类,我面临以下选择:我是否... 直接在REST API中公开原始Java类(或子类),或者 专门为REST API创建新的数据传输类(DTO模式)? 无论哪种方式,我都会有REST数据传输类。问题是是要注释原始文件还是创建新的文件(可能是原始文件的副本)。可能还有其他选择,但我将主要关注这两个。 #1的参数: 干(不要重复自己) 实施更快 升级REST API更容易 #2的参数: 如果REST API需要与Java API分开版本,该怎么办?(这很有可能。) 如果Java数据类发生重大更改(例如,删除属性,添加行为或更改类层次结构)怎么办?(这也有可能。) 底线是,似乎在DRY(#1)和去耦(#2)之间进行了权衡。 我倾向于从#1开始,然后如果出现问题,然后再转到#2,请遵循不构建无法证明自己需要的敏捷指导。这是一个坏主意吗; 如果我认为我最终还是会从那里开始,我应该从#2开始吗? 我的清单中是否缺少主要的论据/后果?
19 java  api  rest  coupling  dry 

3
为小型开源Java项目选择什么软件包名称?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 4年前关闭。 我想用Java发布一个小的开源库。我想知道应该选择哪个软件包名称?我不是公司,我没有一个可根据命名约定命名软件包的基础的域。我还是想以某种方式遵循命名约定,以防止意外冲突并使事情保持标准。

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.