Questions tagged «java»

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

6
在无法到达的代码中抛出新的RuntimeExceptions是否不好?
我被指派去维护一个由更熟练的开发人员编写的应用程序。我遇到了这段代码: public Configuration retrieveUserMailConfiguration(Long id) throws MailException { try { return translate(mailManagementService.retrieveUserMailConfiguration(id)); } catch (Exception e) { rethrow(e); } throw new RuntimeException("cannot reach here"); } 我很好奇投掷RuntimeException("cannot reach here")是否合理。知道这段代码来自经验丰富的同事,我可能会漏掉一些明显的东西。 编辑:这是一些答案所指的扔尸体。我认为这个问题并不重要。 private void rethrow(Exception e) throws MailException { if (e instanceof InvalidDataException) { InvalidDataException ex = (InvalidDataException) e; rethrow(ex); } if (e …

2
如何自动生成Guava单元测试?
番石榴具有自动生成的单元测试用例: 番石榴的单元测试数量惊人:截至2012年7月,番石榴测试包包括286,000多个单独的测试用例。其中大多数都是自动生成的,而不是手工编写的,但是Guava的测试覆盖面非常全面,尤其是对于com.google.common.collect。 它们是如何产生的?使用了哪些技术和技术来设计和生成它们?

5
覆盖具体方法是否有代码气味?
重写具体方法是否确实有代码异味?因为我认为您需要重写具体方法: public class A{ public void a(){ } } public class B extends A{ @Override public void a(){ } } 可以重写为 public interface A{ public void a(); } public class ConcreteA implements A{ public void a(); } public class B implements A{ public void a(){ } } 如果B要在A中重用a(),则可以重写为: public class …

9
设计一个类以将整个类作为参数而不是单个属性
举例来说,假设您有一个应用程序,该应用程序具有广泛共享的类,称为User。此类公开有关用户,其ID,名称,对每个模块的访问级别,时区等所有信息。 用户数据显然在整个系统中得到了广泛的引用,但是无论出于何种原因,都对系统进行了设置,因此,我们不是在将用户对象传递到依赖于该对象的类中,而是从其中传递了各个属性。 需要用户ID的类仅需要GUID userId作为参数,有时我们可能还需要用户名,因此将其作为单独的参数传递。在某些情况下,这将传递给各个方法,因此这些值根本不会保存在类级别。 每当我需要从User类访问不同的信息时,我都必须通过添加参数进行更改,而在不适合添加新的重载的地方,我也必须更改对方法或类构造函数的每个引用。 用户只是一个例子。这在我们的代码中得到了广泛的实践。 我认为这违反了开放/封闭原则,对吗?不仅是更改现有类的行为,而且是首先设置它们,以便将来很有可能需要进行广泛的更改吗? 如果我们只是传入User对象,则可以对正在使用的类进行一些小的更改。如果必须添加参数,则可能不得不对类的引用进行数十次更改。 这种做法是否违反了其他任何原则?依赖倒置也许?尽管我们没有引用抽象,但是只有一种类型的用户,因此并没有真正需要User界面的需求。 是否还有其他违反非Solid的原则,例如基本的防御性编程原则? 我的构造函数应如下所示: MyConstructor(GUID userid, String username) 或这个: MyConstructor(User theUser) 发表编辑: 已经建议在“密码或对象?”中回答问题。这并未回答以下问题的问题:无论哪种方式的决定都会如何影响遵循SOLID原则的尝试,而SOLID原则是此问题的核心。
30 java  c#  design  solid 

4
为什么.equals()在Java中的类中时,为什么.compareTo()在接口中?
我想知道为什么类中有类似方法的同时.compareTo()在Comparable接口.equals中Object。在我看来,为什么.compareTo()没有这样的方法似乎是武断的Object类中。 要使用.compareTo(),您可以实现Comparable接口并根据需要实现.compareTo()方法。对于该.equals()方法,您只需在类中重写该方法,因为所有类都从Object该类继承。 我的问题是,为什么.compareTo()在您实现的接口中而不是在像这样的类中实现这样的方法Object?同样,为什么要.equals()在类中Object而不是在某些接口中实现该方法?

6
Java中的动态代码评估-聪明还是草率?
我正在尝试为我的应用程序在Java中创建一个灵活的ACL框架。 许多ACL框架都建立在规则白名单上,其中规则的形式为owner:action:resource。例如, “ JOHN可以查看资源FOOBAR-1” “ MARY可以查看资源FOOBAR-1” “ MARY可以编辑资源FOOBAR-1” 这很有吸引力,因为规则可以轻松地序列化/持久化到数据库。但是我的应用程序具有复杂的业务逻辑。例如, “部门1中具有5年以上资历的所有用户都可以查看资源FOOBAR-1,否则未经授权” “部门2中的所有用户,如果日期是2016年3月15日之后,则可以查看资源FOOBAR-2,否则未经授权” 乍一想,设计一个可以处理无限复杂规则的数据库模式将是一场噩梦。因此,似乎我需要将它们“烘焙”到编译的应用程序中,为每个用户评估它们,然后根据评估结果生成owner:action:resource规则。 我想避免将逻辑烘焙到已编译的应用程序中。 因此,我正在考虑以谓词:action:resource的形式表示规则,其中谓词是确定是否允许用户的布尔表达式。该谓词将是Java的Rhino引擎可以评估的JavaScript表达式的字符串。例如, return user.getDept() == 1 && user.seniority > 5; 这样,可以轻松地将谓词保存到数据库中。 这很聪明吗?这是草率的吗?这是花哨的吗?这是过度设计的吗?这样安全吗(显然,Java可以将Rhino引擎沙箱化)。

7
即使我知道该方法无法返回错误的输入,我也应该验证方法调用的返回值吗?
我想知道我是否应该通过验证方法调用的返回值是否符合我的期望来进行防御,即使我知道我正在调用的方法将满足此类期望也是如此。 给予 User getUser(Int id) { User temp = new User(id); temp.setName("John"); return temp; } 我应该做吗 void myMethod() { User user = getUser(1234); System.out.println(user.getName()); } 要么 void myMethod() { User user = getUser(1234); // Validating Preconditions.checkNotNull(user, "User can not be null."); Preconditions.checkNotNull(user.getName(), "User's name can not be null."); System.out.println(user.getName()); } …


2
编写低延迟的Java
是否存在用Java编写低延迟代码的特定于Java的技术(不适用于C ++的技术)?我经常看到Java低延迟角色,并且他们要求获得编写低延迟Java的经验-有时似乎有点矛盾。 我唯一能想到的就是JNI的经验,将I / O调用外包给本地代码。也可能使用破坏者模式,但这不是实际技术。 有编写低延迟代码的Java特定技巧吗? 我知道有一个实时Java规范,但是我被警告实时与低延迟不一样。

5
返回不良样式/危险后使用finally子句进行工作吗?
作为编写迭代器的一部分,我发现自己正在编写以下代码(剥离错误处理) public T next() { try { return next; } finally { next = fetcher.fetchNext(next); } } 发现它比阅读起来稍微容易一些 public T next() { T tmp = next; next = fetcher.fetchNext(next); return tmp; } 我知道这是一个简单的示例,在可读性方面的差异可能不会那么大,但我对这样的一般情况感兴趣:在没有涉及异常的情况下,使用try-finally是否不好?如果在简化代码时实际上是首选。 如果不好,为什么?风格,性能,陷阱...? 结论 谢谢大家的回答!我猜得出的结论(至少对我而言)是,如果第一个示例是通用模式,则它可能更具可读性,但事实并非如此。因此,使用超出其目的的构造所带来的混乱,以及可能造成混淆的异常流,将胜过任何简化。

3
C#,Java和Scala的Closures / Lambdas /…方法的优缺点是什么?
我想知道C#和Scala之间在技术上的实现差异是什么,以及两种解决方案如何与布莱恩·格茨(Brian Goetz)发送给Project Lambda(JSR 335)邮件列表的Peek Past lambda电子邮件中表达的实现思想和关注点进行比较? 从电子邮件: 我们探索了“也许lambdas应该只是内部类实例,那真的很简单”之路,但最终走到了“函数是语言未来的更好方向”的位置。 并进一步: 世界的lambdas-are-objects视图与这个可能的未来冲突。对世界的lambda-are-functions视图并不了解,并且保留这​​种灵活性是不让lambda负担甚至带有客观性的负担的要点之一。 结论: Lambdas-are函数打开了大门。Lambdas-are-objects将它们关闭。 我们更希望看到那些门保持打开状态。 有人在Reddit主题上发表了一些评论: 我实际上通过电子邮件向Neal Gafter发送了电子邮件,由于我对他的解释的有限理解,C#和当前的Java设计非常相似,因为Delegates实际上是对象而不是函数类型。似乎他认为Java应该从C#的lambda的缺点中学习并避免它们(就像C#从Java的缺点中获悉并在一开始就避免它们一样)。 为什么“ Lambdas-are-functions”方法比“ Lambdas-are-objects”在将来能提供更多的机会?有人可以解释存在什么差异以及它们如何影响代码的编写方式吗? 看到Scala中的事情“可行”,我一直在想,我缺少关于C#/ Java(8)中采用/提出的方法的某些东西,可能与对向后兼容性的关注有关吗?
30 c#  java  scala  lambda  closures 

5
Groovy会消失吗?[关闭]
我相信这个问题已经被问过很多次了。但是,我想再次问一下这些语言的未来。 我最初被介绍给Groovy,并真的很喜欢它。我觉得语法更简单,并且更接近Java,并且能够快速学习Grails。 然后是Scala,并且网络框架工作为Lift。我仍在学习Scala,有时发现语法很困难。 但是,我仍然想知道Groovy的未来是什么。当Groovy的作者说如果他对Scala 有所了解,他永远也不会创造出Groovy,那让我想知道是否还有未来。当然,Groovy已经走了很长一段路,如今许多大公司都在使用Grails。 如果今天要看Grails vs Lift,那么Grails无疑是赢家。更多的公司正在使用它。但是,鉴于到目前为止我所说的一切,我很想知道是否应该投资Groovy?Groovy离开了,Scala是更好的选择吗?如果宝马首席执行官说他驾驶梅赛德斯,那么人们会想知道我们为什么不也都驾驶梅赛德斯吧? (我知道这个问题是否真的很广泛并且可能是封闭的。但是我希望将其设为对其他人开放的Wiki。)
30 java  scala  groovy  grails 

8
例如,对于大型Web应用程序,在现实世界中使用“强”类型系统吗?
我知道这是一个非常广泛,模棱两可甚至是哲学上的问题。在某种程度上,问题中最重要的关键字-“强”类型系统-本身定义不正确。所以,让我尝试解释我的意思。 问题的总体背景 我们已经在Ruby on Rails中构建了一个非常大型的Web应用程序,并且总体上我们对我们的堆栈感到满意。如果需要的话,我们可以非常快速地发货-可以在90%的“业务”案例中使用,而不必担心10%的边缘案例。另一方面,借助代码审查和测试覆盖率,我们可以缓慢而谨慎地进行,并确保覆盖所有基础-再次,仅在需要进行更仔细检查和安全的情况下。 但是,随着团队的壮大,我开始感到不舒服,因为缺少直接放入我们堆栈中的“安全网”。 我们最近开始在Java上进行一些本机Android开发。我(愉快地)想起了编译/静态/强类型语言提供的安全性。 IDE本身会捕获错误拼写的变量,错误的数据类型,错误的函数调用以及许多琐碎的错误。全部是因为IDE可以挂接到编译器并验证程序“正确性”的某些方面。 是否需要更改功能签名?简单。编译器+ IDE可以帮助您发现所有调用站点。 是否需要确保始终处理某些异常?已检查的救援例外情况。 现在,尽管这些安全功能各有优点,但我也很清楚它们的缺点。更重要的是,在“繁重的” Java世界中。因此,代替Java,我开始研究人们近来开始使用的大量现代“强类型”语言。例如:Scala,Rust,Haskell等。我最感兴趣的是它们的类型系统和静态/编译时检查的功能。 现在,问题 如何在大型应用程序中使用这些功能强大的类型系统和静态/编译时功能? 例如,对于这些强大的功能,我将如何超越标准的“ hello world”介绍?使用富类型系统来建模业务域问题的模型吗?当您位于30,000 LOC +区域中时,类型系统会帮助还是阻碍?当您的系统与弱类型的外部环境交互时,这些类型的系统(和编译时检查)所提供的安全网会如何处理?通过JSON或XML API,各种数据存储,用户输入等。

10
Java中的模板“元编程”是个好主意吗?
在一个相当大的项目中有一个源文件,它具有几个对性能极为敏感的功能(每秒被称为百万次)。实际上,先前的维护者决定编写一个函数的12个副本,每个副本的差别都很小,以节省在单个函数中检查条件的时间。 不幸的是,这意味着代码是要维护的PITA。我想删除所有重复的代码,只写一个模板。但是,Java语言不支持模板,我不确定泛型是否适合于此。 我目前的计划是写一个文件,该文件生成该函数的12个副本(实际上是一个只能使用的模板扩展器)。对于为什么必须以编程方式生成文件,我当然会提供很多解释。 我担心的是,这将导致将来的维护人员感到困惑,并且如果他们在修改文件后忘记重新生成文件,或者(如果更糟糕的话)他们以编程方式生成的文件进行修改,则可能会引入讨厌的错误。不幸的是,除了没有用C ++重写整个过程外,我看不到任何解决方法。 这种方法的好处是否大于缺点?我应该改为: 发挥性能优势,并使用单个可维护的功能。 添加有关为何必须重复执行该功能12次的说明,并应承担维护负担。 尝试将泛型用作模板(它们可能无法那样工作)。 大吼大叫的老维护者,使代码的性能取决于单个函数。 其他保持性能和可维护性的方法? PS:由于该项目的设计不佳,对功能进行性能分析非常棘手……但是,这位前维护人员说服了我,性能下降是不可接受的。我认为他的意思是超过5%,尽管这完全是我的猜测。 也许我应该详细说明一下。这12份副本执行的任务非常相似,但差别很小。在整个函数中的不同地方存在差异,因此不幸的是,有很多很多条件语句。有效地有6种“操作模式”和2种“范例”(由我自己编造的词)。要使用该功能,可以指定操作的“模式”和“范例”。这从来都不是动态的。每段代码仅使用一种模式和范例。所有12个模式范例对都在应用程序中的某个位置使用。这些函数恰当地命名为func1到func12,偶数代表第二个范例,奇数代表第一个范例。 我知道,如果以可维护性为目标,那将是最糟糕的设计。但是它似乎“足够快”,并且这段代码已经有一段时间不需要任何更改了。也值得注意的是原始功能尚未删除(尽管据我所知这是无效代码) ,因此重构将很简单。


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.