从O'Reilly的Essential ActionScript 3.0(2007)第113页开始:
作为最终帮助的方法隐藏了类的内部细节.使类或方法最终阻止其他程序员扩展类或重写方法以检查类的内部结构.这种预防被认为是保护应用程序免遭恶意攻击的方法之一.
这是指编译的,封闭源包的API的用户,以及"恶意利用"来学习关于类设计的东西吗?这真的是个问题吗?
对于更多上下文,这是使用两个原因中的第二个final.在2007版中,它位于第113页的" 继承下字幕"下的" 防止类扩展和方法被覆盖"一章中.
在ActionScript中使用final属性有两个原因:
在某些情况下,最终方法比非最终方法执行得更快.如果您希望以各种可能的方式提高应用程序的性能,请尝试将其方法设为最终.但请注意,在将来的Flash运行时,Adobe期望非最终方法的执行速度与最终方法一样快.
作为最终帮助的方法隐藏了类的内部细节.使类或方法最终阻止其他程序员扩展类或重写方法以检查类的内部结构.这种预防被认为是保护应用程序免遭恶意攻击的方法之一.
简单也许是愚蠢的问题.我有一个登录活动,它启动另一个活动,这里是代码:
public class LoginActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login);
ActionBar actionBar = getActionBar();
actionBar.hide();
Button btnLogin = (Button) findViewById(R.id.btnLogin);
final TextView tvUsername = (TextView) findViewById(R.id.tvUsername);
final TextView tvPassword = (TextView) findViewById(R.id.tvPassword);
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (tvUsername.getText().toString().length()<1) {
Toast msg = Toast.makeText(LoginActivity.this, "Enter a Username", Toast.LENGTH_LONG);
msg.setGravity(Gravity.TOP|Gravity.LEFT, 0, 70);
msg.show();
tvUsername.requestFocus();
} else if (tvPassword.getText().toString().length()<1) {
Toast msg = Toast.makeText(LoginActivity.this, "Enter a Password", Toast.LENGTH_LONG);
msg.setGravity(Gravity.TOP|Gravity.LEFT, 0, 200);
msg.show();
tvPassword.requestFocus(); …Run Code Online (Sandbox Code Playgroud) 在我的实习期间,我的一位同事给了我一个暗示.我想知道这是不是很好的做法.
我正在做的是创建仅用于它们包含的值的类,并且没有任何实际执行某些操作的函数(除了具有getter,setter和构造函数).我声明我的变量是这样的:
public class ObjectIUse{
Private String name;
public ObjectIUse(String name){
this.name = name;
}
public String getName(){
return name;
}
}
Run Code Online (Sandbox Code Playgroud)
所以我没有使用setter因为它应该始终保持不变.我的同事说我也可以这样做:
public class ObjectIUse{
public final String name;
public ObjectIUse(String name){
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
因为现在我们不需要任何getter或setter因为它是公共的,但它也永远不会被更改,因为它是最终的.
哪个更好?或者它可能更适合仍然是私有但最终?我的意思是所有选项都很有效.我只是想知道哪个更好,为什么.
我需要更改内部类中的变量,并且我得到了臭名昭着的"不能引用在不同方法中定义的内部类中的非final变量"错误.
void onStart(){
bt.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
int q = i;
}
});
}
Run Code Online (Sandbox Code Playgroud)
我很快创建了一个包含我想要改变的所有内容的类,并在内部类之外创建了类的最终版本
class temp{
int q;
}
void onStart(){
final temp x = new temp();
bt.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
x.q = i;
}
});
}
Run Code Online (Sandbox Code Playgroud)
这似乎是我需要的,它的工作原理,但我想知道这是如何正确解决问题.另外,我真的很讨厌使用这个词temp来命名我的课程.是否有一个实际的编程术语,以便我为我的课程创建一个更具描述性的名称?
我正在审查Sun认证研究指南,并且有一篇描述最终修饰符的段落.它说
"如果程序员可以自由扩展String类文明,因为我们知道它可能会崩溃"
他什么意思 ?如果可以扩展String Class ...我只是没有一个名为MyString的类继承了所有的Strings属性.如何通过仅扩展它来以任何方式更改实际的String类?
非常感谢您的回答
任何人都可以告诉我在java中使用main方法作为final.
虽然这在java中是允许的
public static final void main(String[] args) {
}
Run Code Online (Sandbox Code Playgroud)
我没有看到任何使用它最终的用途.无论如何它是静态的,所以我们不能覆盖它.
这个问题主要不是关于字符串.出于学术上的好奇心,我想知道final变量上的修饰符如何改变程序的行为.以下示例显示了它是可能的.
打印这些线条 true
final String x = "x";
System.out.println(x + x == "xx");
Run Code Online (Sandbox Code Playgroud)
但这些线条打印出来 false
String x = "x";
System.out.println(x + x == "xx");
Run Code Online (Sandbox Code Playgroud)
除了String实习之外,如果final从变量声明中删除修饰符,还有其他任何可能导致程序行为发生变化的事情吗?我假设程序使用或不使用修饰符进行编译.
请不要投票将其关闭为比较使用==在Java中声明为final的字符串的副本.我理解这个String例子.
我问是否有任何其他原因删除final修饰符可以有所作为.请有人链接到答案或回答问题.谢谢.
在一个方法中我有这个:
int x = 0
if (isA()) {
x = 1;
} else if (isB()) {
x = 2;
}
if (x != 0) {
doLater(() -> showErrorMessage(x)); // compile error here
}
// no more reference to 'x' here
Run Code Online (Sandbox Code Playgroud)
我不明白为什么它会产生编译错误.错误表明这x不是最终的或有效的,因此无法从lambda主体访问它.x在doLater调用之后没有修改,因此在调用x时实际上已经确定了值doLater.
我猜这个问题的答案是因为x没有资格被称为有效最终变量.但是,我想知道原因是什么.
编译器不能只创建一个临时的最终变量,有效地使代码如下:
if (x != 0) {
final int final_x = x;
doLater(() -> showErrorMessage(final_x));
}
Run Code Online (Sandbox Code Playgroud)
一切都还行吗?
内存模型在 17.4 中定义。内存模型。
17.5 中给出了现场final多线程保证。最终字段语义。
我不明白为什么这些是单独的部分。
AFAIKfinal和内存模型都提供了一些保证。
任何真正的程序执行都必须遵守这两个保证。
但现在很清楚这些final保证是否适用于用于验证 17.4.8 中因果关系要求的中间执行。执行和因果关系要求。
另一个不清楚的时刻是17.5.1。Final Fields 的语义定义了一个新的“special” ,它与内存模型happens-before中的不同:happens-before
此happens-before排序不会与其他happens-before排序传递地关闭。
如果它们相同happens-before,则happens-before不再是偏序(因为它不具有传递性)。
我不明白这怎么不会破坏事情。
如果这些不同happens-before,那么就不清楚 17.5 中的是什么。Final Field Semantics确实如此。17.4中
的。内存模型用于限制读取可以返回的内容:happens-before
非正式地,如果没有happens-before排序来阻止
r读取,则允许读取查看写入的结果。w
但是17.5。最后的字段语义是一个不同的部分。