如何创建以下注释的实例(所有字段都设置为其默认值).
@Retention( RetentionPolicy.RUNTIME )
public @interface Settings {
String a() default "AAA";
String b() default "BBB";
String c() default "CCC";
}
Run Code Online (Sandbox Code Playgroud)
我试过了new Settings(),但这似乎不起作用......
Map<String, ArrayList<Pair<String, Integer>>> k = new Map<String, ArrayList<Pair<String, Integer>>>();
Run Code Online (Sandbox Code Playgroud)
这行是在我的代码中.我想实例化一个包含String的Map,然后是一对字符串和整数的ArrayList.
Pair是我写的一个类,在我的包中.
我得到"无法实例化类型Map >>();
为什么不?对我来说似乎合理......
我绝对记得在某个地方看到一个使用反射或其他东西这样做的例子.这与SqlParameterCollection用户无法创造的事情有关(如果我没有记错的话).不幸的是再也找不到了.
有人可以在这里分享这个技巧吗?并不是说我认为它是一种有效的开发方法,我只是对这样做的可能性非常感兴趣.
我正在设计一个类,它定义了一个高度复杂的对象,其中包含大量可选参数(50+),其中许多参数都有默认值(例如:) $type = 'foo'; $width = '300'; $interactive = false;.我正在尝试确定设置构造函数和实例/类变量的最佳方法,以便能够:
鉴于上述情况,我不想让构造函数传递大量的论据.我将传递一个包含初始化值的哈希,例如:$foo = new Foo(array('type'=>'bar', 'width'=>300, 'interactive'=>false));
在编写课程方面,我仍然觉得我宁愿......
class Foo {
private $_type = 'default_type';
private $_width = 100;
private $_interactive = true;
...
}
Run Code Online (Sandbox Code Playgroud)
...因为我相信这将有助于文档生成(您可以获得类属性的列表,这可以让API用户知道他们必须使用的'选项'),并且"感觉"就像正确的方法一样它.
但是你遇到了将构造函数中的传入参数映射到类变量的问题,并且在没有利用符号表的情况下,你进入了一种"暴力"的方法,这让我无法实现目的(尽管我对其他人开放)意见).例如:
function __construct($args){
if(isset($args['type'])) $_type = $args['type']; // yuck!
}
Run Code Online (Sandbox Code Playgroud)
我考虑过创建一个单独的类变量,它本身就是一个关联数组.初始化这将非常简单,例如:
private $_instance_params = array(
'type' => 'default_type',
'width' => 100,
'interactive' => true
);
function __construct($args){
foreach($args as $key=>$value){
$_instance_params[$key] = $value;
}
}
Run Code Online (Sandbox Code Playgroud)
但这似乎我没有利用私有类变量等本机功能,而且感觉文档生成不适用于这种方法.
感谢您阅读这篇文章; 我可能在这里问了很多,但我是PHP的新手,我真的只是寻找这种惯用/优雅的方式.你最好的做法是什么?
附录(有关此特定班级的详细信息) …
System.Activator.CreateInstance(T)方法是否有性能问题(因为我怀疑它使用反射)大到足以阻止我们随便使用它?
假设我有一个Type电话type.
我想确定我是否可以使用我的类型执行此操作(实际上不对每种类型执行此操作):
如果type是,System.Windows.Point那么我可以这样做:
Point point1 = new Point();
Run Code Online (Sandbox Code Playgroud)
但是,如果type是,System.Environment那么这将不会飞:
Environment environment1 = new Environment(); //wrong
Run Code Online (Sandbox Code Playgroud)
因此,如果我遍历程序集中的每个可见类型,如何跳过将无法创建第二个实例的所有类型?我对反思很陌生,所以我的术语还不是很好.希望我在这里尝试做的很清楚.
class TestClass
{
private string _privateString = "hello";
void ChangeData()
{
TestClass otherTestClass = new TestClass();
otherTestClass._privateString = "world";
}
}
Run Code Online (Sandbox Code Playgroud)
这段代码在C#中编译,并且在PHP中等效,但有人可以解释为什么otherTestClass._privateString可以在这里更改?
我认为类的实例在任何情况下都不应该能够更改私有成员变量,并且尝试访问otherTestClass._privateString会因"保护级别"错误而导致"无法访问".
但事实并非如此,那么为什么在自己的类中实例化一个对象可以让你访问私有成员呢?如果它,这不会破坏封装到一定程度?还是我错过了一些明显的东西?
Edit - Thanks for the answers and comments. To clarify, I'm also interested in knowing if being able to do this is regarded as a positive feature, or if it's a necessary tradeoff for better compile-time checking/code clarity/because most other languages do it that way or whatever. It seems to me …
在Scala 2.10中,显然我们正在改进反思.
这将如何影响lift-json,jerkson,sjson和朋友?此外,我们能否在不久的将来期望内置的JSON语言功能和Scala中的Groovy优秀GSON?
我问的原因是我非常喜欢这样做:
case class Foo(a: String, b: Int, bar: Bar)
case class Bar(c: Int)
val foo = Foo("hey", 10, Bar(23))
val json = foo.toJson
Run Code Online (Sandbox Code Playgroud)
没有环跳(即样板准备工作),即使是任意复杂的对象图.也许我问得太多了,但总能做到梦想.请打破我的2.10梦想,或者通过备受期待的Scala版本打开新的途径.
此外,关于案例类,似乎验证/创建,scalaz验证是首选的武器.它看起来非常精彩,可以作为对象创建的安全代理或作为错误收集器.然而,作为一个Scewbie,我发现scalaz有点挑战性,并且尽管它有明显的力量,我仍然抵抗F-ing黑暗面;-)
无论如何,这里的重点是,2.10反射我们应该能够在运行时绑定从表单帖子到案例类的属性的字段,并仅基于属性类型执行基本验证(即不会指定单独的验证逻辑,指定属性foo必须是一个String,因为它的类型已在case类中定义,我们现在可以正确地反映它
那么,勇敢的新世界到来,还是现有的工具是可预见的未来的支柱?
我有一个字符串,它的值是必须实例化的类[MyClass]的名称,而MyClass有一个名为
-(void)FunctionInClass;
Run Code Online (Sandbox Code Playgroud)
我正在使用名为NSClassFromString的方法来实例化MyClass.我想知道
1) what does NSClassFromString return??
2) what is id?
3) How to call method -(void)FunctioninClass which is in MyClass using the instance.
Run Code Online (Sandbox Code Playgroud)
我该怎么办,我是在Objective-C for iPhone app中做的?
从Oracle的Java 教程中我发现了这个文本:
与类方法和变量一样,静态嵌套类与其外部类相关联.和静态类方法一样,静态嵌套类不能直接引用其封闭类中定义的实例变量或方法 - 它只能通过对象引用来使用它们.
注意:静态嵌套类与其外部类(和其他类)的实例成员交互,就像任何其他顶级类一样.实际上,静态嵌套类在行为上是一个顶级类,它已嵌套在另一个顶级类中以方便打包.
使用封闭的类名访问静态嵌套类:
OuterClass.StaticNestedClass
例如,要为静态嵌套类创建对象,请使用以下语法:
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
我认为不可能实例化一个静态类,所以我并不真正理解粗体句子.
你知道这意味着什么吗?
instantiation ×10
c# ×3
java ×3
.net ×2
constructor ×2
reflection ×2
activator ×1
annotations ×1
class ×1
coercion ×1
idioms ×1
json ×1
nested ×1
objective-c ×1
oop ×1
performance ×1
php ×1
scala ×1
static ×1
types ×1