构造Resources.toString(Resources.getResource("foo"), Charsets.UTF_8)
感觉有点麻烦。为什么要坚持转换为URL的第一个?由于getResource()
方法不会抛出异常,为什么不同时使用并行String
方法呢?为什么Guava Resources类没有String方法的版本?
回答
我很确定这一切都归结为正交性和可组合性。 API清楚地将获得URL
的资源做东西与该资源。这很重要,因为您可以通过多种方式获取资源的URL
。 Resources.getResource("foo")
就是其中之一,但在某些情况下它不起作用。如果您需要确保使用特定的ClassLoader
(因为Guava可能由您的应用程序文件加载了不同的ClassLoader
),您需要另一种获取URL
的方法,如Resources.getResource("foo", SomeApplicationClass.class)
。
如果Resources
提供了处理所有这些情况的方法的重载,则该类中方法的数量将增加三倍。 可能似乎在这种特殊情况下是可以接受的,但是如果在整个库中添加了类似的“快捷方式”,方法的数量会很快膨胀起来。图书馆将变得更加难以消化,因为你不得不挖掘出几乎相同的方法来找到你想要的东西。出于这个原因,番石榴倾向于强大的方法来完成一件事,并且与其他方法很好地结合在一起。结合Resources.toString
与Resources.getResource
就是一个例子。
当然,这并不意味着番石榴从来没有提供了这样的快捷方式......它只是这样做,当增加真的看起来值得。例如,大多数的的Files
类中的方法可以中去除,因为你可以结合Files.newInputStreamSupplier
,Files.newWriterSupplier
等与在ByteStreams
和CharStreams
类的方法来完成同样的事情。但鉴于File
上的常见操作,快捷键被认为是值得的。 (请注意,采取String
名重载是不增加,虽然)。
如果Resources.getResource()抛出异常或其他问题,那么这会更具吸引力。我几乎从来没有在我的代码中玩过类装载器,所以对我来说,它只是感觉像一个额外的箍环跳过。但感谢您的答案。 – Jherico 2012-02-22 22:21:34
- 1. 为什么没有guava Objects.equal(Object,Object)为原始类型?
- 2. 为什么没有String#shift()?
- 3. 为什么Object类没有Thread方法
- 4. 为什么org.lwjgl.opengl.GL43类没有glDrawElements方法?
- 5. 为什么Guava的ImmutableList有很多重载的()方法?
- 6. 为什么std :: cin.getline没有采用std :: string的oveloaded方法?
- 7. 为什么std :: string没有大写/小写,格式等方法?
- 8. BitmapFont类没有getBound(String)方法
- 9. 为什么python string split()没有分裂
- 10. 为什么BigInteger(String)没有BigInteger(long)?
- 11. 为什么没有string.Split(string)超载?
- 12. 有没有像String的toHTML方法?
- 13. 我没有得到什么。 String == String False
- 14. RxJS为什么forkJoin方法在版本5中没有很好地记录?
- 15. 为什么String类是final?
- 16. 为什么没有为命名指针类型定义方法?
- 17. json accumulate(String,String)方法没有找到
- 18. 为什么没有Array.IsNullOrEmpty()方法?
- 19. 为什么Object [ID]没有方法'Animate'?
- 20. 为什么ObservableCollection没有RemoveAll方法?
- 21. 为什么DataTable.Rows没有.Where()方法?
- 22. 为什么GLAutoDrawable没有方法addMouseListener将
- 23. 为什么Rails没有belongs_to through方法?
- 24. 为什么NStepLSTM没有reset_state方法?
- 25. RandomAccess接口,为什么没有方法?
- 26. 为什么GLSurfaceView.Renderer中没有onSurfaceDestroyed方法?
- 27. 为什么没有Convert.toFloat()方法?
- 28. 为什么NSArray没有firstObject方法?
- 29. 为什么SerializationInfo没有TryGetValue方法?
- 30. 为什么VolatileImage没有set/getPixel()方法
除非参与图书馆的答案或者有人引用,它的所有的猜测 - 不知道这是一个非常适合左右。我会猜测,因为URL是通用的,比字符串更通用。 – 2012-02-21 23:40:37
就我个人而言,我期望一个String重载接受一个'URL'作为一个字符串,而不是资源名称,因为我更习惯于使用URL(主要是因为Jetty的'ClassLoader'的资源处理的大脑充满了失败)。也许他们想避免含糊不清? – FauxFaux 2012-02-22 00:01:37
@DaveNewton,绝大多数Guava团队(包括你的真人)_does_关注StackOverflow上的番石榴标签,并经常回答这些问题。 我不知道这个问题的答案,所以我不能回答,但我认为在这里提出这样的问题是完全正确的,希望有一个番石榴团队成员回应。 – 2012-02-22 00:26:43