Questions tagged «java»

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

9
为什么使用可选的优先选择对变量进行空检查?
举两个代码示例: if(optional.isPresent()) { //do your thing } if(variable != null) { //do your thing } 据我所知,最明显的区别是Optional需要创建一个附加对象。 但是,许多人已经开始迅速采用Optionals。使用可选与空检查相比有什么优势?
25 java  java8 

9
如何传达插入顺序在地图中的重要性?
我正在从数据库中获取一组元组,并将其放入地图中。数据库查询成本很高。 映射中的元素没有明显的自然顺序,但是插入顺序仍然很重要。对地图进行排序将是一项繁重的操作,因此鉴于查询结果已经按照我想要的方式进行了排序,因此我想避免这样做。因此,我只是将查询结果存储到中LinkedHashMap,然后从DAO方法返回地图: public LinkedHashMap<Key, Value> fetchData() 我有一种方法processData应该在地图上进行一些处理-修改一些值,添加一些新的键/值。定义为 public void processData(LinkedHashMap<Key, Value> data) {...} 但是,一些短毛猫(Sonar等)抱怨说,“数据”的类型应该是诸如“地图”之类的接口,而不是实现“ LinkedHashMap”(squid S1319)。 所以基本上说我应该有 public void processData(Map<Key, Value> data) {...} 但是我希望方法签名说映射顺序很重要 -这对算法很重要processData-这样我的方法就不会仅传递任何随机映射。 我不想使用SortedMap,因为它(来自的javadocjava.util.SortedMap)“是根据其键的自然顺序来排序的,或者是由通常在排序的地图创建时提供的Comparator来排序的。” 我的键没有自然的顺序,创建比较器不执行任何操作似乎很冗长。 而且我仍然希望它是一个地图,以利用它put来避免重复的键等。如果没有,则data可能是一个List<Map.Entry<Key, Value>>。 那么我怎么说我的方法想要一个已经排序的地图?可悲的是,没有java.util.LinkedMap接口,否则我会使用它。
24 java  code-quality  map 

5
在Java中,私有助手应该放在公共方法之上还是之下?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 我注意到一个同事和我在Java类中对方法的排序有相反的做法。我们中的一个人开始使用主要的公共方法上课,然后再放置所有私人帮手。我们中的另一个人确保公共方法在最后。 显然,这只是样式问题,没有正确的答案。但是,在我们决定这件事只是Yooks vs Zooks的另一场争执而只是任意选择一个之前,我想知道是否存在标准的Java风格指南推荐,或者某种可行的理由,为什么一种方法比另一种更好。

9
依赖注入:我应该使用框架吗?
我最近在一个Python项目中工作,我们在其中进行了大量依赖注入(因为必须使该应用程序可测试),但是我们没有使用任何框架。有时手动连接所有依赖项可能有点乏味,但总体来说效果很好。 当必须在多个位置创建对象时,我们只需一个函数(有时是该对象的类方法)即可创建生产实例。每当我们需要该对象时,都会调用此函数。 在测试中,我们做同样的事情:如果多次需要创建对象的“测试版本”(即由模拟对象支持的真实实例),我们就有一个函数来创建此“测试版本”类,用于测试。 就像我说的那样,总体来说效果很好。 我现在正在进入一个新的Java项目,并且我们正在决定是使用DI框架还是手动进行DI(例如上一个项目)。 请说明使用DI框架的工作方式会有所不同,以及以什么方式比手动“原始”依赖项注入更好或更坏。 编辑:我也想补充一个问题:您是否亲眼目睹了没有框架的手动执行DI的任何“专业级”项目?

10
在OOP中似乎需要循环引用的现实活动建模的正确方法是什么?
我一直在努力解决Java项目中有关循环引用的问题。我正在尝试对现实世界中的情况进行建模,在这种情况下,所讨论的对象似乎是相互依赖的,并且需要彼此了解。 该项目是玩棋盘游戏的通用模型。基本类是非特定类,但已扩展为处理国际象棋,西洋双陆棋和其他游戏的特定类。11年前,我用六种不同的游戏将其编码为applet,但问题是它充满了循环引用。那时,我通过将所有相互交织的类填充到一个源文件中来实现它,但是我意识到这在Java中是不好的形式。现在,我想实现与Android应用类似的功能,并且我想正确地执行操作。 这些类是: RuleBook:可以针对诸如棋盘的初始布局,其他初始游戏状态信息(例如谁先移动,可用的移动,可用的移动,提议的移动后游戏状态发生了什么)等问题进行询问的对象。当前或提议的董事会职位。 棋盘:游戏棋盘的简单表示,可以指示其反映移动。 MoveList:移动列表。这是双重目的的:在给定的位置选择可用的动作,或者在游戏中进行的动作列表。它可以分为两个几乎相同的类,但这与我要问的问题无关,并且可能会使它进一步复杂化。 搬家:一招。它以原子列表的形式包含了有关移动的所有内容:从这里拿起一块,放到那里,从那里取出被捕获的一块。 状态:正在进行的游戏的完整状态信息。不仅是董事会的位置,而且还有MoveList以及其他状态信息,例如现在要移动的人。在国际象棋中,将记录每个棋手的国王和乌鸦是否已移动。 例如,循环引用比比皆是:RuleBook需要了解游戏状态以确定给定时间可用的棋步,但是游戏州需要查询RuleBook的初始开始布局以及一次棋步会带来哪些副作用它是制造出来的(例如,下一个移动者)。 我尝试分层组织新的类集,其中RuleBook位于顶部,因为它需要了解所有信息。但这导致必须将许多方法移至RuleBook类中(例如进行移动),从而使其成为整体,并不能特别代表RuleBook应该是什么。 那么组织此活动的正确方法是什么?我应该将RuleBook变成BigClassThatDoesAlmostEverythingInTheGame以避免循环引用,而放弃对真实游戏进行精确建模的尝试吗?还是应该坚持使用相互依赖的类并哄骗编译器以某种方式对其进行编译,同时保留我的实际模型?还是我缺少一些明显的有效结构? 谢谢你提供的所有帮助!

6
为什么LMAX的团队为什么要使用Java并设计架构以避免不惜一切代价避免GC?
为什么LMAX的团队为什么要用Java 设计LMAX Disruptor,但所有设计都着眼于最大限度地减少GC使用?如果不想运行GC,那么为什么要使用垃圾回收语言? 他们的优化,硬件知识水平和他们的想法都很棒,但是为什么要使用Java? 我不反对Java或其他任何东西,但是为什么要使用GC语言?为什么不使用不带GC的D之类的语言或其他语言却允许高效的代码呢?是团队最熟悉Java还是Java拥有我没有看到的某些独特优势? 假设他们使用带有手动内存管理功能的D进行开发,会有什么区别?他们将不得不考虑低级(他们已经是),但是他们可以从系统本身中榨取最佳性能。

6
为什么不将Java用作构建语言?
想要改善这篇文章吗?提供此问题的详细答案,包括引文和答案正确的解释。答案不够详细的答案可能会被编辑或删除。 如果Java是一种通用语言,而构建程序可以用Java语言来描述,那么为什么这不是编写构建文件的最佳方法,而是使用Ant,Maven和Gradle之类的工具呢?那不是更直接,而且不需要学习另一种编程语言吗?(顺便说一句-这个问题也可以应用于其他语言,例如C#)
24 java  c#  builds  build-system 

3
静态工厂vs单身工厂
在我的某些代码中,我有一个类似于以下内容的静态工厂: public class SomeFactory { // Static class private SomeFactory() {...} public static Foo createFoo() {...} public static Foo createFooerFoo() {...} } 在代码审查期间,建议将其作为一个单例并注入。因此,它应如下所示: public class SomeFactory { public SomeFactory() {} public Foo createFoo() {...} public Foo createFooerFoo() {...} } 需要强调的几件事: 两个工厂都是无状态的。 方法之间的唯一区别是它们的范围(实例与静态)。实现是相同的。 Foo是没有接口的bean。 我要静态化的参数是: 该类是无状态的,因此不需要实例化 能够调用静态方法比必须实例化工厂似乎更自然。 工厂作为单例的参数是: 注入一切都很好 尽管工厂是无状态的,但使用注入进行测试还是比较容易的(易于模拟) 测试消费者时应该嘲笑它 …

5
加载应用程序设置的最佳方法
保留Java应用程序设置的一种简单方法是使用扩展名为“ .properties”的文本文件表示,该文件包含与特定值(此值可以是数字,字符串,日期等)关联的每个设置的标识符。 。C#使用类似的方法,但文本文件必须命名为“ App.config”。在这两种情况下,都必须在源代码中初始化一个特定的类来读取设置:此类具有一种方法,该方法返回与指定的设置标识符关联的值(作为字符串)。 // Java example Properties config = new Properties(); config.load(...); String valueStr = config.getProperty("listening-port"); // ... // C# example NameValueCollection setting = ConfigurationManager.AppSettings; string valueStr = setting["listening-port"]; // ... 在这两种情况下,我们都应该解析从配置文件加载的字符串,并将转换后的值分配给相关的类型化对象(在此阶段可能发生解析错误)。解析步骤之后,我们必须检查设置值是否属于特定的有效域:例如,队列的最大大小应为正值,某些值可能是相关的(例如:min <max ), 等等。 假设应用程序应在启动时立即加载设置:换句话说,应用程序执行的第一个操作是加载设置。设置的任何无效值必须自动替换为默认值:如果一组相关设置发生这种情况,则这些设置都将设置为默认值。 执行这些操作的最简单方法是创建一个方法,该方法首先解析所有设置,然后检查加载的值,最后设置任何默认值。但是,如果使用这种方法,维护将很困难:随着开发应用程序时设置数量的增加,更新代码变得越来越困难。 为了解决此问题,我想到了如下使用“ 模板方法”模式。 public abstract class Setting { protected abstract bool TryParseValues(); protected …

5
Java instanceof运算符是否被视为反射,反射的定义是什么?
我今天与同事讨论了使用Java运算符的使用是否instanceof是一种反思。讨论很快演变成实际定义反射的内容。 那么,反射的定义是什么? 并instanceof认为使用了“使用反射”吗? 另外,如果instanceof将其视为反射,那么多态性还不是“利用反射”吗?如果没有,有什么区别?

7
Python生产力VS Java生产力
在SO上,我遇到了一个问题,即哪种Java或Python最适合在Google AppEngine上开发。许多人吹嘘使用Python而不是Java可以提高生产率。关于Python与Java生产率的争论,我要说的一件事是,Java具有出色的IDE来加快开发速度,而Python由于其动态特性而在该领域确实缺乏。 因此,即使我更喜欢将Python用作语言,但我认为与Java相比,它不能显着提高生产率,特别是在使用新框架时。显然,如果它是Java vs Python,并且您可以使用的唯一编辑器是VIM,那么Python可以极大地提高您的生产率,但是当将IDE引入方程式时,它就不是那么明确了。 我认为Java的优点通常仅在语言水平上评估,并且常常基于过时的假设,但是Java在语言本身之外具有许多优点,例如JVM(经常受到批评,但潜力巨大),出色的IDE和工具,大量的第三种政党图书馆,平台等。 问题,Python /相关的动态语言是否真的可以带来经常提到的巨大的生产率提升?(考虑使用新框架并使用中型到大型应用程序)。

1
为什么在未捕获的异常之后Java成功退出?
每当Perl,Python,C ++或Tcl程序因未处理的异常而暂停时,这些语言运行时都会注意为该过程注册一个非零的退出代码。如果基于Eclipse的程序在启动过程中失败,则它们也会返回1。java.exe但是,由标准运行的程序无论终止多么突然,都会很高兴地返回零,除非程序System.exit()使用退出值进行调用。甚至AssertionFailedError或UnsatisfiedLinkError作为成功退出被报告回调用程序。 当然,并非所有系统都具有程序返回码,但是Unix和Windows非常重要,足以保证java.lang.Process.exitValue()子进程的运行。他们还不保证为父流程遵守约定吗? 这是语言设计上的缺陷还是仅仅是实现上的缺陷?是否有争论说这是个好主意?
24 java  exceptions 

4
开发人员应该完全了解哪些算法和数据结构?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我想成为一名成功的企业Java开发人员。我应该精通哪些算法和数据结构?您会推荐什么书给我? 要成为一名成功的Java开发人员,我是否需要了解所有高级算法,例如CLRS中给出的算法? 您可以按优先级从高到低的顺序列出我应该学习的主题吗? 我必须知道: 正在搜寻? 排序? 图/树? 等等?

2
为什么构建器应该是内部类而不是其自己的类文件中?
许多Builder Pattern示例都将Builder其构建为对象的内部类。 这有一定道理,因为它表明了Builder构建的内容。但是,使用静态类型的语言,我们知道Builder构建的内容。 另一方面,如果Builder是内部类,则应了解Builder构建的类,而无需查看内部Builder。 而且,将构建器作为内部类可以减少导入的次数,因为外部类可以引用该构建器(如果您对此很在意)。 然后是一些实际的示例,其中Builder放在同一包中,而不是内部类(如)StringBuilder。您知道Builder 应该建立一个,String因为它名为so。 话虽这么说,我能想到的制作Builder内部类的唯一好理由是,您Builder无需知道类的名称或依赖命名约定就可以知道类的含义。例如,如果我StringBuilder是一个内部类,String我可能会知道它比我(推测性)早存在。 是否有其他原因可以使Builder内部类成为阶级,或者只是归结为偏好和仪式?

6
如果只使用一次,是否应该定义一个字符串常量?
我们正在为Jaxen(Java的XPath库)实现一个适配器,该适配器允许我们使用XPath来访问应用程序的数据模型。 这是通过实现将字符串(从Jaxen传递给我们的)映射到数据模型的元素的类来完成的。我们估计我们将需要大约100个类,总共超过1000个字符串比较。 我认为,执行此操作的最佳方法是将字符串直接写入代码的简单if / else语句-而不是将每个字符串都定义为常量。例如: public Object getNode(String name) { if ("name".equals(name)) { return contact.getFullName(); } else if ("title".equals(name)) { return contact.getTitle(); } else if ("first_name".equals(name)) { return contact.getFirstName(); } else if ("last_name".equals(name)) { return contact.getLastName(); ... 但是,总是有人告诉我,我们不应该将字符串值直接嵌入代码中,而应该创建字符串常量。看起来像这样: private static final String NAME = "name"; private static final String TITLE …

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.