我了解到,当您在Java中修改变量时,它不会更改它所基于的变量
int a = new Integer(5);
int b = a;
b = b + b;
System.out.println(a); // 5 as expected
System.out.println(b); // 10 as expected
Run Code Online (Sandbox Code Playgroud)
我假设对象有类似的东西.考虑这个课程.
public class SomeObject {
public String text;
public SomeObject(String text) {
this.setText(text);
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
Run Code Online (Sandbox Code Playgroud)
在我尝试这段代码后,我感到困惑.
SomeObject s1 = new SomeObject("first");
SomeObject s2 = s1;
s2.setText("second");
System.out.println(s1.getText()); // second as UNexpected
System.out.println(s2.getText()); // second as expected
Run Code Online (Sandbox Code Playgroud)
请向我解释为什么更改任何对象会影响另一个对象.我知道变量文本的值存储在两个对象的内存中的相同位置.
为什么变量的值是独立的但与对象相关?
另外,如果简单的赋值不能完成工作,如何复制SomeObject?
class Sub {
static int y;
public static void foo() {
this.y = 10;
}
}
Run Code Online (Sandbox Code Playgroud)
我理解,它this代表调用该方法的对象,并且静态方法不绑定到任何对象.但在上述情况下,变量y也是静态的.
如果我们可以在类对象上调用静态方法,为什么我们不能允许静态方法来设置类的静态变量.
这个附加约束的目的是什么?
我对PMD规则有疑问Avoid instantiating new objects inside loops.这是一些示例代码:
import java.awt.Dimension;
public class PMDDemo {
public static void main(final String[] args) {
final Dimension[] arr = new Dimension[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = new Dimension(i, i); // rule violation here
}
}
}
Run Code Online (Sandbox Code Playgroud)
PMD在代码中的标记位置给出了上述规则违规.我怎么创造ň没有环内创建这些类的实例?
我知道PMD的一些规则是有争议的(比如onlyOneExit规则).但到目前为止,我至少理解了他们背后的想法.我不明白这条规则背后的原因.有人可以帮助我吗?
我正在使用Eclipse PMD Plug-in (4.0.0.v20130510-1000)并且获得了很多违规行为:
Found 'DD'-anomaly for variable 'freq' (lines '187'-'189').
Found 'DU'-anomaly for variable 'freq' (lines '189'-'333').
在这个 SO答案中,它说这些异常与分配从未读过的值有关.但是我在这种情况下得到了违规行为:
// here I get a DD anomaly
double freq = 0;
try {
// here I get a DU anomaly
freq = Double.parseDouble(getFrequencyTextField().getText());
} catch (final NumberFormatException e) {
Log.e(e.getMessage());
}
if (freq < 10E6) doSomething();
Run Code Online (Sandbox Code Playgroud)
如果我删除初始化并freq = 0;在catch块中添加一行,则DD异常消失,但我在两个分配上都得到DU异常.
现在我的问题是:我该如何应对?什么是PMD的首选解决方案?这个规则究竟试图阻止什么(即为什么这是不好的做法)?
我开始使用MiGLayout进行GUI设计,我需要的一个功能是根据其他组件的状态显示/隐藏某些组件.
当我注意到MiGLayout支持的一个组件约束时,我自己会编码hidemode.
这是否符合我的想法?如果是这样,假设hidemode已经设置,我该如何触发隐藏/取消隐藏动作?(查看文档后,我能够找到如何设置hidemode,但之后不再使用它)
hidemode设置组件的隐藏模式.如果已在"隐藏"模式中指定了隐藏模式,则可以通过组件约束覆盖此模式.隐藏模式指定了布局管理器应如何处理不可见的组件.模式是:
0 - 默认.意味着隐藏组件的处理方式与可见组件完全相同.
1 - 组件的大小(如果不可见)将设置为0,0.2
- 组件的大小(如果不可见)将设置为0,0并且间隙也将在其周围设置为0.
3 - 不可见组件根本不会参与布局,例如它不会占用网格单元.
示例:"hidemode 1"
我有一个与设备固件通信的应用程序.由于固件有变化,因此会使用该格式进行版本控制{major}.{minor}.{revision}[beta[{beta}]].为了给你举几个例子,当前的版本0.4.7beta将随后出现0.4.7beta2,偶尔会0.4.7出现0.4.8beta.遗憾的是,固件的版本控制格式不在我的控制之下,所以我无法更改它.
我需要一种相互比较固件的方法.基本上,我需要一个功能
boolean isFirmwareNewer(String testFW, String baseFW);
Run Code Online (Sandbox Code Playgroud)
到目前为止我所做的是将这种格式转换为简单格式int.因此0.4.7beta2将成为00040702(每个级别2位数).问题是,那
0.0.0更新的通配符0.4.7beta2并不比新版本更新0.4.7).这很容易解释(if (testFW.contains("beta")) testFWValue -= 100;但它也不是很优雅.你们这些人是如何正常做的(或者你们会怎么做)?
如果你愿意,我可以附上我目前使用的代码,但正如我所说,它是> 40行代码而不是真正可读(这就是我寻找更好的方法来实现这一目的的原因).
我用a JScrollPane来包装一个JTable.根据配置,有一些空间未被表占用.它被绘制为灰色(看起来它是透明的,你可以看到后面的组件).如何将此区域设置为某种颜色?
这是一个SSCCE来说明.
import java.awt.Color;
import java.util.Vector;
import javax.swing.JDialog;
import javax.swing.JScrollPane;
import javax.swing.JTable;
public class DialogDemo extends JDialog {
public static void main(final String[] args) {
final DialogDemo diag = new DialogDemo();
diag.setVisible(true);
}
public DialogDemo() {
super();
setTitle("SSCCE");
final Vector<Vector<String>> rowData = new Vector<Vector<String>>();
final Vector<String> columnNames = new VectorBuilder<String>().addCont("Property").addCont("Value");
rowData.addElement(new VectorBuilder<String>().addCont("lorem").addCont("ipsum"));
rowData.addElement(new VectorBuilder<String>().addCont("dolor").addCont("sit amet"));
rowData.addElement(new VectorBuilder<String>().addCont("consectetur").addCont("adipiscing elit."));
rowData.addElement(new VectorBuilder<String>().addCont("Praesent").addCont("posuere..."));
final JTable table = new JTable(rowData, columnNames);
JScrollPane pane = new JScrollPane(table);
// ************* make …Run Code Online (Sandbox Code Playgroud) 我有一个图表,其中一些数据具有线性y轴和对数x轴.问题是关于对数(x-)轴.
我希望x轴上的对数刻度与精确的十年(10的幂)对齐,但我不希望轴必须在确切的几十年开始; 我希望它从我的数据开始的地方开始.例如,轴可以从3开始; 但是第一个主要刻度应该是10.我该怎么做?
目前,当我将轴设置为从3开始时,主网格线为3,这是不好的.
当我设置以下属性时,网格和刻度很好,但这是因为我强制轴开始十年(我不想这样做).
.Chart.Axes(xlCategory).ScaleType = xlScaleLogarithmic
.Chart.Axes(xlCategory).HasMajorGridlines = True
.Chart.Axes(xlCategory).HasMinorGridlines = True
.Chart.Axes(xlCategory).MinimumScale = 10 ^ (Int(Application.Log10(Cells(DATA_START, 6))))
.Chart.Axes(xlCategory).MaximumScale = 10 ^ (Int(Application.Log10(Cells(DATA_START + n, 6)) - 0.00001) + 1)
Run Code Online (Sandbox Code Playgroud)
这就是它的样子:漂亮的网格,但轴不在正确的位置开始.

现在,当我没有专门将我的轴的最小值和最大值绕到十年时,
' ...
.Chart.Axes(xlCategory).MinimumScale = 0.9 * Cells(DATA_START, 6)
.Chart.Axes(xlCategory).MaximumScale = 1.1 * Cells(DATA_START + n, 6)
Run Code Online (Sandbox Code Playgroud)
它看起来像这样,轴从正确的位置开始,但网格/刻度看起来很傻:

在这个例子中,我希望第一个刻度为100,在此之前只有次要刻度/网格线.
我已经想通了,我可以设置两个主要滴答之间的乘法因子.MajorUnit = 10.
我有一个SSCCE:只需在空白纸上运行此宏.它生成一个图表,其中包含主要的刻度线(和网格线)18, 180, 1800,但我想要它们100, 1000.
Sub CreateDemoPlot()
Range("A1:A6") = Application.Transpose(Split("20,40,100,1000,4500,10000", ","))
Range("B1:B6") = Application.Transpose(Split("-30,-50,-90,-70,-75,-88", ","))
With ActiveSheet.ChartObjects.Add(Left:=100, …Run Code Online (Sandbox Code Playgroud) 以下是我的代码
class NumberComparator<Number> implements Comparator<Number> {
public int compare(Number o1, Number o2) {
return 1;
}
}
public class Ex28 {
public static void main(String[] args) {
TreeSet set = new TreeSet(new NumberComparator<Number>());
set.add(1);
set.add(1.4f);
set.add(1L);
set.add("1a");
System.out.println(set);
}
}
Run Code Online (Sandbox Code Playgroud)
因为我已经定义了我自己的Number类型的比较器,但是当我添加任何其他字符串的东西时,它并没有给我任何异常.它只是工作正常.我得到了输出
[1, 1.4, 1, 1a]
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释它为什么会发生.
我正在使用Inno Setup为我的应用程序创建安装程序.安装程序非常基本,只是复制一些文件.这非常有效,我很满意.
我最近实现了USB支持,需要从IVI基础安装USB驱动程序.它基本上是一个exe文件,必须在安装过程中的某个地方启动.到目前为止,用户必须单独安装驱动程序,这不是那么优雅.我的第一个方法是:
[Run]
Filename: "{app}\driver\IviSharedComponents_2.2.1.exe"; Description: "Install USB driver (IVI Foundation)"; Flags: postinstall skipifsilent
Filename: "{app}\driver\IviSharedComponents64_2.2.1.exe"; Description: "Install 64bit USB driver (IVI Foundation)"; Flags: postinstall skipifsilent
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, "&", "&&")}}"; Flags: postinstall skipifsilent
Run Code Online (Sandbox Code Playgroud)
这有效,但用户必须选择正确的位数.这里的优点是他可以选择不安装它(在这种情况下,应用程序只是忽略USB功能,这很好).我真正想要的是自动检测系统的位数并运行设置过程.这不一定在该[Run]部分,虽然我没有任何反对它(因为用户可以选择不安装它).
我还找到了一些代码并试图像这样运行它:
[Code]
procedure CurStepChanged (CurStep: TSetupStep);
var
WorkingDir: String;
ReturnCode: Integer;
begin
if (ssInstall = CurStep) then
Log('Starting driver installation');
WorkingDir := ExpandConstant ('{app}\driver');
Exec ('IviSharedComponents_2.2.1.exe', '', WorkingDir, SW_SHOW, ewWaitUntilTerminated, ReturnCode);
end;
Run Code Online (Sandbox Code Playgroud)
但这不会启动安装(虽然我可以看到日志条目'启动驱动程序安装').我的道路有问题吗?我做错了什么?如何更改此脚本以根据位数自动选择正确的可执行文件?
编辑:我使用提议的解决方案与[Tasks]条目.实现看起来像这样(仅供参考):
[Tasks]
Name: "install_usb"; Description: "Install …Run Code Online (Sandbox Code Playgroud) java ×8
pmd ×2
swing ×2
background ×1
charts ×1
collections ×1
excel ×1
excel-vba ×1
gui-design ×1
inno-setup ×1
jtable ×1
jviewport ×1
loops ×1
miglayout ×1
object ×1
oop ×1
pointers ×1
reference ×1
regex ×1
static ×1
this ×1
variables ×1
vba ×1
versioning ×1