更新:
这个我还是不太清楚。我试图找到 JLS 来描述这种行为。相反,我在 8.3 of the JLS 中找到了这句话:
Member class declarations (§8.5) describe nested classes that are members of the surrounding class. Member classes may be static, in which case they have no access to the instance variables of the surrounding class; or they may be inner classes (§8.1.3).
这是否意味着嵌套静态类不应该访问外部类变量?我在哪里可以找到关于行为应该是什么的说明?
结束更新
我正在寻求通过静态嵌套类的实例对外部类的私有(private)成员的可访问性进行一些澄清。 Java tutorials状态:
a static nested class is behaviorally a top-level class that has been nested in another top-level class for packaging convenience
这个问题 ( Java inner class and static nested class ) 的公认答案提到:
The only real conceivable reason to create a static inner class is that such a class has access to its containing class's private static members
但似乎静态嵌套类也可以访问封闭类的任何实例的私有(private)成员?这在行为上与任何其他顶级类不同。在下面的示例中,静态嵌套类 Builder 可以访问 Config 类的任何实例的私有(private)成员。但是另一个顶级类将无法做到这一点(例如 ConfigTest 的实例将无法更改配置对象的私有(private)成员,如注释的 manipulateConfig 方法。
我的理解正确吗?我没有在 JLS 中找到引用来为我澄清这一点。
配置:
public class Config {
private String param1;
private int param2;
private Config() {}
public String getParam1() { return param1; }
public int getParam2() { return param2; }
@Override
public String toString() {
return "Config{" + "param1=" + param1 + ", param2=" + param2 + '}';
}
public static class Builder {
private String param1;
private int param2;
public Builder setParam1(String param1) { this.param1 = param1; return this; }
public Builder setParam2(int param2) { this.param2 = param2; return this; }
public Config build() {
Config config = new Config();
config.param1 = param1; // <- Accessing private member of outer class
config.param2 = param2;
return config;
}
public void modifyParm2(Config config, int newVal) {
config.param2 = newVal; // <- Able to modify private member of any enclosing class
}
}
}
配置测试:
public class ConfigTest {
private Config getConfig() {
Config.Builder builder = new Config.Builder();
Config config = builder
.setParam1("Val1")
.setParam2(2)
.build();
return config;
}
// private void manipulateConfig(Config config, String newParam1) {
// config.param1 = newParam1;
// }
public static void main(String[] args) {
ConfigTest configTest = new ConfigTest();
Config config = configTest.getConfig();
System.out.println(config);
Config.Builder anotherBuilder = new Config.Builder();
anotherBuilder.modifyParm2(config, 3);
System.out.println(config);
// configTest.manipulateConfig(config, "val11");
}
}
运行 ConfigTest 的输出:
Config{param1=Val1, param2=2}
Config{param1=Val1, param2=3}
最佳答案
您链接到的答案并不完全正确:嵌套静态类可以访问其封闭类的所有成员,包括私有(private)成员。
他们无法访问其封闭实例的实例成员,无论是公共(public)的还是私有(private)的。但是,如果您将静态嵌套类的方法传递给封闭类的实例,则嵌套类将能够访问封闭类的所有成员,无论他们的访问级别如何。
我认为静态/非静态混淆来自 JLS 的这一行:
Member classes may be static, in which case they have no access to the instance variables of the surrounding class
这并不意味着静态嵌套类根本无法访问实例变量。这意味着静态嵌套类无法像非静态嵌套类那样“免费”访问封闭类的实例变量。
对我来说,静态嵌套类和顶级类之间的两个主要区别是
Map.Entry 嵌套接口(interface)是比 MapEntry 顶级接口(interface)更好的可读性选择。关于java - 静态嵌套类可以完全访问私有(private)外部类成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27181290/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我打算为ruby脚本创建一个安装程序,但我希望能够确保机器安装了RVM。有没有一种方法可以完全离线安装RVM并且不引人注目(通过不引人注目,就像创建一个可以做所有事情的脚本而不是要求用户向他们的bash_profile或bashrc添加一些东西)我不是要脚本本身,只是一个关于如何走这条路的快速指针(如果可能的话)。我们还研究了这个很有帮助的问题:RVM-isthereawayforsimpleofflineinstall?但有点误导,因为答案只向我们展示了如何离线在RVM中安装ruby。我们需要能够离线安装RVM本身,并查看脚本https://raw.github.com/wayn
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的