小编rma*_*ski的帖子

传递哈希值而不是方法参数

我看到在Ruby(和动态类型语言,通常)中,一种非常常见的做法是传递散列,而不是声明具体的方法参数.例如,不是使用参数声明一个方法,而是像这样调用它:

def my_method(width, height, show_border)
my_method(400, 50, false)
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

def my_method(options)
my_method({"width" => 400, "height" => 50, "show_border" => false})
Run Code Online (Sandbox Code Playgroud)

我想知道你对它的看法.这是好事还是坏事,我们应该这样做吗?在什么情况下使用这种做法是有效的,它有什么危险的情况?

ruby oop coding-style

78
推荐指数
3
解决办法
4万
查看次数

开放封闭原则和Java"最终"修饰符

开放封闭原则指出"软件实体(类,模块,功能等)应该是可以扩展的,但是对于修改是封闭的".

然而,Joshua Bloch在其着名的书"Effective Java"中给出了以下建议:"继承的设计和文档,或者禁止它",并鼓励程序员使用"final"修饰符来禁止子类化.

我认为这两个原则显然是相互矛盾的(我错了吗?).编写代码时遵循哪个原则,为什么?你是否打开你的课程,不允许继承你的课程(哪些?),或者尽可能使用最终修饰语?

java open-closed-principle

22
推荐指数
5
解决办法
5054
查看次数

如何限制Java 8应用程序消耗的总内存?

为了限制Java 7应用程序消耗的总内存,我可以使用以下公式(取自本文):

最大内存= [-Xmx] + [-XX:MaxPermSize] + number_of_threads*[-Xss]

删除PermGen后,此公式如何为Java 8应用程序更改?

我应该使用选项"-XX:MaxMetaspaceSize"来限制元空间消耗的最大内存吗?

java jvm memory-management java-8

13
推荐指数
1
解决办法
3639
查看次数

序列化在构造函数中初始化的映射

我刚刚遇到了一个与Java序列化有关的有趣问题.

似乎我的地图定义如下:

Map<String, String> params = new HashMap<String, String>() {{
  put("param1", "value1");
  put("param2", "value2");
}};
Run Code Online (Sandbox Code Playgroud)

我尝试使用ObjectOutputStream将其序列化为一个文件:

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(outputFile));
oos.writeObject(params);
Run Code Online (Sandbox Code Playgroud)

...我得到java.io.NotSerializableException.

但是,如果我将标准方式的值放到地图上:

Map<String, String> params = new HashMap<String, String>();
params.put("param1", "value1");
params.put("param2", "value2");
Run Code Online (Sandbox Code Playgroud)

...然后序列化工作正常.

任何人都可以告诉我它为什么会发生这些声明之间有什么区别?我认为他们应该一样,但显然我错过了一些东西.

java serialization hashmap

9
推荐指数
1
解决办法
173
查看次数

如何升级使用ORM工具构建的数据库模式?

我正在寻找使用ORM工具升级数据库模式的通用解决方案,如JPOX或Hibernate.你是如何在你的项目中做到的?

我想到的第一个解决方案是创建自己的升级数据库机制,SQL脚本完成所有工作.但在这种情况下,我必须记住每次更新对象映射时都要创建新脚本.而且我仍然需要处理低级SQL查询,而不仅仅是定义映射并允许ORM工具完成所有工作......

所以问题是如何正确地做到这一点.也许有些工具允许简化这个任务(例如,我听说Rails内置了这样的机制),如果是这样,请帮我决定为我的下一个Java项目选择哪个ORM工具.

java database migration orm

5
推荐指数
1
解决办法
5009
查看次数

将"init"中定义的servlet实例变量标记为"volatile"

是否有必要将所有servlet实例变量标记为"volatile"(或从同步部分中访问它们)?包括那些在"init"方法中定义的,之后没有修改过的?

我知道"init"方法是由一个线程调用的,并且该变量将被另一个线程访问,因此它似乎是必要的.或者可能不是?是否有任何机制可以保证在"init"方法完成后,所有其他线程都可以看到实例变量的当前值?

java concurrency servlets

4
推荐指数
1
解决办法
699
查看次数

在Java 8中传递对实例方法的引用

我有一个类有几个返回相同类型的方法.所以,例如,我有以下对象定义:

interface MyClass {
  String first();
  String second();
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个方法,它接受这个类的对象列表,并应根据参数调用其中一个first()second()方法.一个例子:

void myMethod(List<MyClass> objs, boolean executeFirst) {
    objs.forEach(obj -> System.out.println(executeFirst ? obj.first() : obj.second()));
}
Run Code Online (Sandbox Code Playgroud)

有没有办法用executeFirst参数和实例方法替换参数,我想在objs对象上执行?所以,例如,理想情况下我想要这样的东西:

void myMethod(List<MyClass> objs, Supplier<String> instanceMethod) {
    objs.forEach(obj -> System.out.println(obj::instanceMethod.get());
}
Run Code Online (Sandbox Code Playgroud)

java-8

3
推荐指数
1
解决办法
91
查看次数