Questions tagged «java»

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

5
继承与具有空值的其他属性
对于具有可选字段的类,使用继承或可为空的属性更好吗?考虑以下示例: class Book { private String name; } class BookWithColor extends Book { private String color; } 要么 class Book { private String name; private String color; //when this is null then it is "Book" otherwise "BookWithColor" } 要么 class Book { private String name; private Optional<String> color; //when isPresent() …
12 java  inheritance  class  null 


2
Java 8 Stream实例是否应该始终是close()'?
对Javadoc的看法: 流具有BaseStream.close()方法并实现AutoCloseable,但实际上几乎所有流实例在使用后实际上都不需要关闭。通常,只有源是IO通道的流(例如,由Files.lines(Path,Charset)返回的流)才需要关闭。大多数流都由集合,数组或生成函数支持,不需要特殊的资源管理。(如果流确实需要关闭,则可以在try-with-resources语句中将其声明为资源。) “几乎所有”和“通常”是模糊的-如果您正在编写库,并且要从该Stream的用户中提取Stream的源,那么无论如何,您总是必须问自己一个问题-“我应该关闭这个?” IO支持的流需要关闭,因为终端操作不会调用close,所以有效地我总是必须记住/记录我的Stream的来源,或者我总是必须这样close做。 我猜想,最明智的选择是不从方法中返回Streams或接受Stream参数,这是JDK团队中某些人所认同的观点。考虑到Streams的实用性,我发现这过于局限。 关闭Streams的最佳做法是什么?我在网上寻找了一些JDK人员的答案,这些人员通常都积极参与类似的社区问题,但是没有发现任何相关的内容。
12 java  resources  java8 

2
java集合框架接口中的UnsupportedOperationException
通过Java Collections Framework查看,我注意到相当多的接口都带有comment (optional operation)。这些方法允许类只通过UnsupportedOperationException不想实现的方法来实现。 这方面的一个示例是中的addAll方法Set Interface。 现在,如本系列问题所述,接口是使用预期的定义合同。 接口很重要,因为它们将类的工作与工作方式分开。合同规定了客户的期望,使开发人员可以自由选择自己选择的方式实施合同,只要他们遵守合同即可。 和 界面是对对象可以执行的操作的描述……例如,当您打开电灯开关时,电灯就亮了,您不在乎如何做,只是它确实在做。在面向对象的程序设计中,接口是对象成为“ X”所必须具有的所有功能的描述。 和 我认为基于接口的方法要好得多。然后,您可以很好地模拟您的依赖关系,并且基本上所有事物之间的耦合都不太紧密。 接口的意义是什么? 什么是接口? 接口+扩展(mixin)与基类 鉴于接口的目的是定义一个契约并使您的依赖关系松散耦合,是否有些方法不能UnsupportedOperationException达到目的?这意味着我不能再通过了Set,只能使用addAll。相反,我必须知道Set我通过了什么实现,所以我可以知道是否可以使用addAll。对我来说,这似乎毫无价值。 那有什么意义UnsupportedOperationException呢?它只是在弥补遗留代码,并且需要清理其接口吗?还是我错过了更有意义的目的?


3
单元测试比赛
我的雇主每月举行一次单元测试日比赛。一整天专门用于编写单元测试-显然,我们每个月都要进行更多测试,但这是一整天-竞赛的“优胜者”将获得奖励。但是,我们发现很难确定谁是赢家。 我们为每个测试用例分配点。因此,如果您编写了这样的单元测试... for (int i = 0; i < 100; i++) { assertTrue(i*i, square(i)); } 您将获得100分。显然,这是一个简单的示例,但是它演示了为每个测试用例分配“点”的问题。 我们主要是一家Java&Javascript商店。因此,我建议将经过测试的代码分支数量作为度量标准。我们可以轻松地通过代码覆盖率工具(例如EclEmma)来计算测试的分支。但是,不确定如何通过Selenium测试以及如何在Javascript源代码覆盖方面做到这一点(有什么想法吗?) 有谁对我们如何更好地确定本次比赛的获胜者有任何建议? 编辑 我知道如何编写单元测试,我知道如何编写有效的单元测试,不需要帮助确定要测试的内容。我无法控制这场比赛-比赛将继续进行。因此,我要么添加一些输入以使其更好,要么继续进行测试游戏(是的,我进行游戏。当然,我进行游戏。有奖品可以赢得) 编辑 这个问题在这里显然是不重复的,但它包含有关如何找到好的测试用例有用的信息,它没有提供任何有用的指标来评估的竞争。

2
通过将期望超类型的子类对象作为参数传递来覆盖方法
我只是在学习Java,而不是一名实践的程序员。 我要遵循的书说,重写方法时,参数类型必须相同,但是返回类型可以是多态兼容的。 我的问题是为什么传递给重写方法的参数不能不是预期的超类型的子类类型? 在重载方法中,可以保证在对象上定义了我对对象调用的任何方法。 有关建议的重复项的注意事项: 第一个建议似乎是关于类层次结构以及在何处放置功能。我的问题更集中于为什么存在语言限制。 在第二个建议,说明如何做我问什么,而不是为什么它做的方式。我的问题集中在为什么。

6
如何避免垂头丧气?
我的问题是关于超类Animal的特殊情况。 我Animal可以moveForward()和eat()。 Seal延伸Animal。 Dog延伸Animal。 还有一个特殊的生物也Animal被称为Human。 Human还实现了方法speak()(不是由实现Animal)。 在接受抽象方法的实现中,Animal我想使用该speak()方法。如果不进行低调,这似乎是不可能的。杰里米·米勒(Jeremy Miller)在他的文章中写道,沮丧的气味。 在这种情况下,如何避免垂头丧气呢?

5
通过简单的替换将Windows文件路径转换为Unix文件路径是否安全?
因此,例如说我拥有它,这样我的所有文件都将从Windows机器转移到Unix机器,例如:C:\test\myFile.txtto {somewhere}/test/myFile.txt(此时驱动器号无关)。 当前,我们自己编写的实用程序库提供了一种方法,可以用正斜杠简单地替换所有反斜杠: public String normalizePath(String path) { return path.replaceAll("\\", "/"); } 斜杠是保留的,不能成为文件名的一部分,因此应保留目录结构。但是,我不确定Windows和Unix路径之间是否还有其他可能需要担心的麻烦(例如:非ASCII名称等)

2
为什么Java不支持像C ++这样的私有/受保护的继承?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 在C ++中继承类时,用户可以指定访问说明符,例如, class Base { public int mem1; protected in mem2; }; class Derived1 : **private** Base { // mem1 will be private here. // mem2 will be private here. }; class Derived2 : **protected** Base { // mem1 will be protected here. // mem2 will be protected …

10
如何在不使用可变变量的情况下编写有用的Java程序
我正在阅读一篇有关函数式编程的文章,作者在其中指出 (take 25 (squares-of (integers))) 请注意,它没有变量。实际上,它只具有三个功能和一个常数。尝试在Java中写整数平方而不使用变量。哦,也许有一种方法可以做到,但是它当然是不自然的,而且读起来也不如我上面的程序那么好。 用Java可以实现吗?假设您需要打印前15个整数的平方,是否可以在不使用变量的情况下编写for或while循环? Mod通知 这个问题不是代码高尔夫球比赛。我们正在寻找可以解释所涉及概念的答案(理想情况下,无需重复先前的答案),而不仅是针对另一段代码。

1
在Java 8中删除功能类型的原因
我一直试图理解为什么JDK 8 Lambda专家组(EG)决定不在Java编程语言中包括新的函数类型。 在邮件列表中,我找到了一个讨论删除函数类型的话题。 许多语句对我来说是模棱两可的,这可能是由于缺乏上下文,在某些情况下,是因为我对类型系统的实现了解有限。 但是,我相信我可以安全地在此站点中提出几个问题,以帮助我更好地理解它们的含义。 我知道我可以在邮件列表中提出问题,但是该线程很旧,并且所有决策都已制定,因此我很可能会被忽略,尤其是看到这些人已经推迟了他们的计划。 在支持删除功能类型并支持使用SAM类型的回答中,Brian Goetz说: 没有修复。关于修正函数类型的实用性有很长的篇幅。如果不进行具体化,函数类型将受到阻碍。 我找不到他提到的话题。现在,我可以理解,结构函数类型的引入可能暗示着Java(通常是名义上的类型)系统中的某些复杂性,我无法理解的是参数化SAM类型在具体化方面有何不同。 难道他们都没有受到相同的修复问题吗?有谁知道功能类型在参数化方面与参数化SAM类型有何不同? 格茨在另一条评论中说: 有两种基本的键入方法:标称方法和结构方法。名词的标识基于其名称;结构类型的标识基于其组成(例如“ int,int的元组”或“ int到float的函数”。)大多数语言大多选择名词性或结构性;除了“边缘”外,没有多少语言能够成功地混合名义和结构类型。Java几乎完全是名义上的(有一些例外:数组是结构型的,但是在底部总是有名义上的元素类型;泛型也有名义上的和结构上的混合,实际上这是许多源代码的一部分)人们对泛型的抱怨。)将结构类型系统(函数类型)嫁接到Java上 标称类型的系统意味着新的复杂性和边缘情况。函数类型的好处值得吗? 那些拥有实施类型系统经验的人。您知道他在这里提到的这些复杂性或极端情况的任何例子吗? 老实说,当我认为像Scala这样完全基于JVM的编程语言支持结构类型(如函数和元组)时,即使存在底层平台的验证问题,我也对这些指控感到困惑。 不要误会我的意思,我并不是说功能类型应该比SAM类型更好。我只想了解他们为什么做出这个决定。

2
这些关于Java并发性的高级/不公平面试问题吗?[关闭]
按照目前的情况,这个问题并不适合我们的问答形式。我们希望答案得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意调查或扩展讨论。如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 这是我最近问过的受访者的一些问题,这些受访者说他们知道Java并发性: 解释“内存可见性”的危害-JVM可以对不受监视器保护且未声明的变量重新排序某些操作的方式volatile,以使一个线程可能看不到另一个线程所做的更改。通常,我通过显示存在此危害的代码来问这个问题(例如NoVisibility,Goetz等人的“ Java Concurrency in Practice”中的清单3.1中的示例),并询问出了什么问题。 说明不仅volatile影响声明的实际变量volatile,而且还影响线程在更改volatile变量之前对变量所做的任何更改。 为什么用volatile代替synchronized? 使用wait()和实现条件变量notifyAll()。说明为什么要使用notifyAll()。说明为什么要使用while循环测试条件变量。 我的问题是-这些是适当的还是太高级了,无法问一个知道Java并发的人? 而当我们讨论它时,您是否认为应该期望从事Java并发工作的人员对Java垃圾回收的了解高于平均水平?

7
递归函数可以有迭代/循环吗?
我一直在研究递归函数,很显然,它们是可以自我调用的函数,并且不使用迭代/循环(否则它将不是递归函数)。 但是,在网上浏览示例(8皇后递归问题)时,我发现此功能: private boolean placeQueen(int rows, int queens, int n) { boolean result = false; if (row < n) { while ((queens[row] < n - 1) && !result) { queens[row]++; if (verify(row,queens,n)) { ok = placeQueen(row + 1,queens,n); } } if (!result) { queens[row] = -1; } }else{ result = …
12 java  recursion 

2
分离Java项目
我有一个大型的Java项目,我们在构建周期中使用了maven。这个项目被广泛使用-在其他项目中,在各种应用程序中,其中一些包含在其中,有些则在其他地方...老实说,这有点混乱(针对特定时间,在不同时间添加了不同的位目的),我想对其进行清理。另外,它还没有经过完全测试(没有适当的单元和集成测试就添加了很多位),并且有些测试需要很长时间才能运行或实际上没有通过……(嗯)测试在Maven构建周期中关闭(再次,呃,哦)。 我正在考虑将这个大型项目分成较小的特定项目,以使“最终”子项目(或几个子项目)可以选择所需的各个子项目。 我的想法如下: 如果我将一个大型项目分为多个子项目,这将清楚说明每个项目的责任。 通过分成多个子项目,我可以分别清理每个子项目的测试,然后在maven构建周期中打开该子项目的测试。 我有点担心这可能会对构建时间产生影响。 在大型项目上(即放入较小的子项目中)采用结构会减慢编译器的速度吗? 另外,我对这可能会对IDE中的编辑时间产生什么影响(我们主要使用Intellij)略有担忧。Intellij似乎是通过依赖关系树依次构建每个项目的-例如,如果C依赖于B依赖于A,而我更改了A,除非A进行编译,否则它不会尝试构建B。可以说这是有好处的,但是我发现,例如,如果我更改了A在B和C中广泛使用的接口,则需要花费一些时间来修复该更改中的所有错误... 另一个问题是如何使用工厂类。该项目的某些方面取决于外部罐子。有时(非常不经常)更新这些内容,因此我们必须进行迁移。我们倾向于使用Factory类来处理此问题,该类指向外部代码的正确版本(因此,我们不必在整个代码库中更改所有实现)。 目前,这一切都在大型项目中,但是我认为通过切换到子项目,我可以开发一个新项目来实施新的外部代码,确保子项目功能完整并经过测试,并且然后在用户项目中切换依赖项/工厂类。但是,由于在整个大型项目中大量使用接口,因此使情况变得更加复杂。例如 子项目A-包含接口 子项目B-取决于A的接口和旧的外部jar 子项目C-依赖于B(以及A和旧的外部jar),并且包含一个使用B的接口实现的Factory类。 如果需要更改B的外部jar,我可以: 创建子项目B_ii-再次取决于A,现在取决于新的外部jar 一旦功能完备,我可以将C的依赖项添加到B_ii,并更改Factory类以使用接口的新实现。 当这一切正常的时候,我就可以删除C对原始B的依赖关系,如果需要,可以删除子项目B。 这是明智的做法吗? 因此,总的来说,我的问题是: 有没有人有分解大型项目的经验?您是否愿意分享任何提示/技巧? 这对您的开发和构建时间有什么影响? 您可以在构建此类项目的分解方面提供什么建议?

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.